Sed-strings

提供:Dev Guides
移動先:案内検索

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

代替コマンド

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

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

ここで、 address1address2 はそれぞれ開始アドレスと終了アドレスであり、行番号またはパターン文字列のいずれかです。 これらのアドレスは両方ともオプションのパラメーターです。 パターンは、置換文字列で置き換えるテキストです。 さらに、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番目のコンマはそのまま残ります。 Why? パターンが一致するとすぐに、SEDはそれを置換文字列で置き換え、次の行に移動します。 デフォルトでは、最初の出現のみを置き換えます。 すべての出現を置換するには、次のようにSEDでグローバルフラグ(g)を使用します。

[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 \ + \)*は、入力文字列の1つの単語に一致します。

入力文字列には、スペースで区切られた3つの単語があるため、スペースで区切られた 3 正規表現があります。 最初の正規表現は最初の単語、つまり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