ストリームエディタ-文字列

代替コマンド

「検索と置換」などのテキスト置換操作は、どのテキストエディタでも一般的です。このセクションでは、SEDがテキスト置換を実行する方法を説明します。以下に、置換コマンドの構文を示します。

[address1[,address2]]s/pattern/replacement/[flags]

ここに、 address1 そして address2はそれぞれ開始アドレスと終了アドレスであり、行番号またはパターン文字列のいずれかです。これらのアドレスは両方ともオプションのパラメータです。パターンは、置換文字列で置換するテキストです。さらに、SEDでオプションのフラグを指定できます。

books.txtファイルでは、各列を区切るためにコンマ(、)を使用しています。縦棒(|)を使用して各列を区切ります。これを行うには、コンマ(、)を垂直バー(|)に置き換えます。

[jerry]$ sed 's/,/ | /' books.txt

上記のコードを実行すると、次の結果が得られます。

1) A Storm of Swords | George R. R. Martin, 1216 
2) The Two Towers | J. R. R. Tolkien, 352 
3) The Alchemist | Paulo Coelho, 197 
4) The Fellowship of the Ring | J. R. R. Tolkien, 432 
5) The Pilgrimage | Paulo Coelho, 288 
6) A Game of Thrones | George R. R. Martin, 864

注意深く観察すると、最初のコンマのみが置き換えられ、2番目のコンマはそのまま残ります。どうして?パターンが一致するとすぐに、SEDはそれを置換文字列に置き換え、次の行に移動します。デフォルトでは、最初のオカレンスのみが置き換えられます。すべてのオカレンスを置き換えるには、次のようにグローバルフラグ(g)をSEDで使用します。

[jerry]$ sed 's/,/ | /g' books.txt

上記のコードを実行すると、次の結果が得られます。

1) A Storm of Swords | George R. R. Martin | 1216 
2) The Two Towers | J. R. R. Tolkien | 352 
3) The Alchemist | Paulo Coelho | 197 
4) The Fellowship of the Ring | J. R. R. Tolkien | 432 
5) The Pilgrimage | Paulo Coelho | 288 
6) A Game of Thrones | George R. R. Martin | 864

これで、コンマ(、)のすべての出現が垂直バー(|)に置き換えられます。

パターン一致が成功した場合にのみテキスト置換を実行するようにSEDに指示できます。次の例では、行にパターンThe Pilgrimageが含まれている場合にのみ、コンマ(、)を垂直バー(|)に置き換えます。

[jerry]$ sed '/The Pilgrimage/ s/,/ | /g' books.txt

上記のコードを実行すると、次の結果が得られます。

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage | Paulo Coelho | 288 
6) A Game of Thrones, George R. R. Martin, 864

これに加えて、SEDはパターンの特定のオカレンスを置き換えることができます。コンマ(、)の2番目のインスタンスのみを垂直バー(|)に置き換えましょう。

[jerry]$ sed 's/,/ | /2' books.txt

上記のコードを実行すると、次の結果が得られます。

1) A Storm of Swords, George R. R. Martin | 1216 
2) The Two Towers, J. R. R. Tolkien | 352 
3) The Alchemist, Paulo Coelho | 197 
4) The Fellowship of the Ring, J. R. R. Tolkien | 432 
5) The Pilgrimage,Paulo Coelho | 288 
6) A Game of Thrones, George R. R. Martin  | 864

上記の例では、SEDコマンドの最後(またはフラグの場所)の数字は2番目の出現を意味します。

SEDは興味深い機能を提供します。置換を実行した後、SEDは変更された行のみを表示するオプションを提供します。この目的のために、SEDはp印刷を参照するフラグ。次の例では、変更された行のみをリストしています。

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt

上記のコードを実行すると、次の結果が得られます。

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

変更した行を別のファイルに保存することもできます。この結果を達成するには、w国旗。次の例は、その方法を示しています。

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt

同じSEDコマンドを使用しました。内容を確認しましょうjunk.txt ファイル。

[jerry]$ cat junk.txt

上記のコードを実行すると、次の結果が得られます。

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

大文字と小文字を区別しない置換を実行するには、大文字と小文字を区別しないことを意味するiフラグを使用します。次の例では、大文字と小文字を区別しない置換を実行します。

[jerry]$ sed  -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt

上記のコードを実行すると、次の結果が得られます。

3) The Alchemist, PAULO COELHO, 197 
5) The Pilgrimage, PAULO COELHO, 288

これまで、区切り文字としてフォアスラッシュ(/)文字のみを使用してきましたが、区切り文字として垂直バー(|)、アットマーク(@)、キャレット(^)、感嘆符(!)を使用することもできます。次の例は、他の文字を区切り文字として使用する方法を示しています。

パスを置き換える必要があるとしましょう /bin/sed/home/jerry/src/sed/sed-4.2.2/sed. したがって、SEDコマンドは次のようになります。

[jerry]$ echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/jerry\/src\/sed\/sed-4.2.2\/sed/'

上記のコードを実行すると、次の結果が得られます。

/home/jerry/src/sed/sed-4.2.2/sed

このコマンドをより読みやすく、理解しやすくすることができます。垂直バー(|)を区切り文字として使用して、結果を確認しましょう。

[jerry]$ echo "/bin/sed" | sed 's|/bin/sed|/home/jerry/src/sed/sed-4.2.2/sed|'

上記のコードを実行すると、次の結果が得られます。

/home/jerry/src/sed/sed-4.2.2/sed

確かに!同じ結果が得られ、構文が読みやすくなりました。同様に、次のように「アット」記号(@)を区切り文字として使用できます。

[jerry]$ echo "/bin/sed" | sed 's@/bin/sed@/home/jerry/src/sed/sed-4.2.2/sed@'

上記のコードを実行すると、次の結果が得られます。

/home/jerry/src/sed/sed-4.2.2/sed

これに加えて、区切り文字としてキャレット(^)を使用できます。

[jerry]$ echo "/bin/sed" | sed 's^/bin/sed^/home/jerry/src/sed/sed-4.2.2/sed^'

上記のコードを実行すると、次の結果が得られます。

/home/jerry/src/sed/sed-4.2.2/sed

次のように、感嘆符(!)を区切り文字として使用することもできます。

[jerry]$ echo "/bin/sed" | sed 's!/bin/sed!/home/jerry/src/sed/sed-4.2.2/sed!'

上記のコードを実行すると、次の結果が得られます。

/home/jerry/src/sed/sed-4.2.2/sed

通常、バックスラッシュ(/)は区切り文字として使用されますが、SEDでサポートされている他の区切り文字を使用する方が便利な場合もあります。

部分文字列の作成

強力な代替コマンドを学びました。一致したテキストから部分文字列を見つけることができるかどうかを見てみましょう。例を使ってそれを行う方法を理解しましょう。

次のテキストを考えてみましょう。

[jerry]$ echo "Three One Two"

それをシーケンスに配置する必要があるとします。つまり、最初に1つ、次に2つ、最後に3つを印刷する必要があります。次のワンライナーは必要なことをします。

echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'

上記の例では、垂直バー(|)が区切り文字として使用されていることに注意してください。

SEDでは、部分文字列はグループ化演算子を使用して指定でき、エスケープ文字をプレフィックスとして付ける必要があります。 \( そして \)

\wは任意の文字、数字、またはアンダースコアに一致する正規表現であり、「+」は複数の文字に一致するために使用されます。言い換えれば、正規表現\(\w\+\) 入力文字列の単一の単語に一致します。

入力文字列には、スペースで区切られた3つの単語があるため、 threeスペースで区切られた正規表現。最初の正規表現は最初の単語を格納します。つまり、3つ、2番目の正規表現は単語を格納します。One、そして3番目は単語を格納します Two

これらの部分文字列は、 \N,ここで、Nは部分文字列番号です。したがって、\2 2番目の部分文字列を出力します。 One; \3 3番目の部分文字列を出力します。 Two; そして \1 最初の部分文字列を出力します。 Three

これらの単語をコンマ(、)で区切り、それに応じて正規表現を変更してみましょう。

[jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'

上記のコードを実行すると、次の結果が得られます。

One,Two,Three

正規表現にスペースの代わりにコンマ(、)が含まれていることに注意してください。

文字列置換フラグ(GNU SEDのみ)

前のセクションでは、置換コマンドの例をいくつか見てきました。GNU SEDは、置換文字列で使用できるいくつかの特別なエスケープシーケンスを提供します。これらの文字列置換フラグはGNU固有であり、SEDの他のバリアントでは機能しない可能性があることに注意してください。ここでは、文字列置換フラグについて説明します。

  • \ L:置換文字列に\ Lを指定すると、\ Lの後の単語の残りのすべての文字が小文字として扱われます。たとえば、文字「ULO」は小文字として扱われます。

[jerry]$ sed -n 's/Paulo/PA\LULO/p' books.txt

上記のコードを実行すると、次の結果が得られます。

3) The Alchemist, PAulo Coelho, 197
5) The Pilgrimage, PAulo Coelho, 288
  • \ u:置換文字列に\ uを指定すると、\ uの直後の文字が大文字として扱われます。次の例では、文字「a」および「o」の前に\ uが使用されています。したがって、SEDはこれらの文字を大文字として扱います。

[jerry]$ sed -n 's/Paulo/p\uaul\uo/p' books.txt

上記のコードを実行すると、次の結果が得られます。

3) The Alchemist, pAulO Coelho, 197 
5) The Pilgrimage, pAulO Coelho, 288
  • \ U:置換文字列に\ Uを指定すると、\ Uの後の単語の残りのすべての文字が大文字として扱われます。

[jerry]$ sed -n 's/Paulo/\Upaulo/p' books.txt

上記のコードを実行すると、次の結果が得られます。

3) The Alchemist, PAULO Coelho, 197 
5) The Pilgrimage, PAULO Coelho, 288
  • \ E:このフラグは\ Lまたは\ Uとともに使用する必要があります。フラグ\ Lまたは\ Uによって開始された変換を停止します。次の例では、最初の単語のみが大文字に置き換えられています。

[jerry]$ sed -n 's/Paulo Coelho/\Upaulo \Ecoelho/p' books.txt

上記のコードを実行すると、次の結果が得られます。

3) The Alchemist, PAULO coelho, 197 
5) The Pilgrimage, PAULO coelho, 288