sedチュートリアル(8)のSed文字列

7331 ワード

このチュートリアルでは、文字列処理の重要なsedコマンドについて説明します.テキストファイルがあることを考えてみましょう.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

置換コマンド
「検索と置換」テキスト置換操作文字列が最も一般的です.置換コマンドの構文は、次のとおりです.
[address1[,address2]]s/pattern/replacement/[flags]
ここで、address 1およびaddress 2は、それぞれ開始アドレスおよび終了アドレスであり、行番号またはモード列であってもよい.この2つのアドレスはオプションのパラメータです.
このモードは、置換する置換文字列の文字列です.また、オプションのフラグを指定して機能を強化することもできます.
以下は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は置換文字列に置き換えられ、次の行に移動する.デフォルトでは、最初の出現のみが置き換えられます.すべての出現を置換するには、次のように、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

1つのパターンが一致した場合にのみ、Sedがテキスト置換を実行することを示すことができる.次の例では、カンマ(,)を縦線(|)で置き換え、行にパターンが含まれている場合にのみ使用します.
[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番目のインスタンス(|)に置き換えます.次は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

変更された行だけでなく、次のように印刷するには、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

今はtxtファイルがすべて変更されたファイル.確認しよう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

非区切り記号
通常、区切り記号として反スラッシュ(/)が使用されますが、sedを使用するために他のサポートデリミタが使用される場合があります.
これまでは、区切り記号として反スラッシュ(/)文字のみを使用してきましたが、縦線(|)、at記号(@)、挿入記号(^)、感嘆符(!)も使用できます.次の例では、セパレータとして他の文字を使用する方法を示します.
次の例では、縦線(|)を区切り文字として使用します.
[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

同様に、以下に示すように、「at」記号(@)を区切り記号として使用することができます.
[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 

サブストリングの作成
私たちは強力な代替命令を学んだ.一致するテキスト文字列が見つかるかどうか見てみましょう.1つの例で説明する方法を理解します.
次の文字を見てください.
[jerry]$ echo "Three One Two"

シーケンスに配置するとします.つまり、1部、2つ、最後の3つを印刷する必要があります.次の単行コードで実行します.
[jerry]$ echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'

sedサブストリングは、パケットオペレータを使用して指定することができ、プリフィックス、すなわち(および)としてエスケープ文字を使用する必要があります.
ここで、wは、任意のアルファベットまたはアンダースコアと「+」記号を一致させる正規表現です.言い換えれば、正規表現(w+)は、入力列の単一の文字から一致する.
このサブストリングはN,Nがサブストリング番号から中継される.したがって、2は、2番目のサブストリング、すなわち1つを印刷する.3第3のサブストリング、すなわち2つを印刷する.および1印刷第1子、すなわちThree
これらの言葉をカンマ(,)で区切って、それに応じて式を変更しましょう.
[jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'

上記のコードを実行すると、次の結果が得られます.
One,Two,Three

文字列置換フラグ
GNU Sedは、置換文字列においていくつかの特殊なエスケープシーケンスを使用することができる.これらの文字列置換フラグはGNUで具体的に指定されており、Sedの他の変種とは動作しない可能性があります.ここでは、文字列置換フラグについて説明します.
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を指定します.次の例では、u文字が'a'と'o'の前に使用されます.したがって、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標識
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