ストリームエディタ-特殊文字
SEDは、コマンドとして扱われる2つの特殊文字を提供します。この章では、これら2つの特殊文字の使用法について説明します。
=コマンド
「=」コマンドは行番号を扱います。以下に、「=」コマンドの構文を示します。
[/pattern/]=
[address1[,address2]]=
=コマンドは、行番号とそれに続く内容を標準出力ストリームに書き込みます。次の例はこれを示しています。
[jerry]$ sed '=' books.txt
上記のコードを実行すると、次の結果が得られます。
1
1) A Storm of Swords, George R. R. Martin, 1216
2
2) The Two Towers, J. R. R. Tolkien, 352
3
3) The Alchemist, Paulo Coelho, 197
4
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5
5) The Pilgrimage, Paulo Coelho, 288
6
6) A Game of Thrones, George R. R. Martin, 864
行番号と最初の4行の内容を印刷してみましょう。次のコマンドは、最初の4行を行番号付きで出力し、残りを行番号なしで出力します。
[jerry]$ sed '1, 4=' books.txt
上記のコードを実行すると、次の結果が得られます。
1
1) A Storm of Swords, George R. R. Martin, 1216
2
2) The Two Towers, J. R. R. Tolkien, 352
3
3) The Alchemist, Paulo Coelho, 197
4
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に指示できます。次の例では、パターン「Paulo」を含む行番号を出力します。
[jerry]$ sed '/Paulo/ =' books.txt
上記のコードを実行すると、次の結果が得られます。
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864
次のSEDコマンドが何をするか推測できますか?
[jerry]$ sed -n '$ =' books.txt
上記のコードを実行すると、次の結果が得られます。
6
はい、その通りです。ファイルに存在する行の総数をカウントします。コードをわかりやすく説明しましょう。コマンドセクションでは、最後の行の行番号とその内容を出力する「$ =」を使用しました。しかし、私たちはまた提供しました-n パターンバッファのデフォルトの印刷を抑制するフラグ。したがって、最後の行番号のみが表示されます。
&コマンド
SEDは特殊文字&をサポートしています。パターンマッチングが成功するたびに、この特殊文字は一致したパターンを格納します。多くの場合、置換コマンドとともに使用されます。この効率的な機能をどのように活用できるかを見てみましょう。
book.txtファイルの各行には番号が付けられています。単語を追加しましょうBook number各行の先頭に。次の例はこれを示しています。
[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt
上記のコードを実行すると、次の結果が得られます。
Book number 1) A Storm of Swords, George R. R. Martin, 1216
Book number 2) The Two Towers, J. R. R. Tolkien, 352
Book number 3) The Alchemist, Paulo Coelho, 197
Book number 4) The Fellowship of the Ring, J. R. R. Tolkien, 432
Book number 5) The Pilgrimage, Paulo Coelho, 288
Book number 6) A Game of Thrones, George R. R. Martin, 864
この例は非常に単純です。最初に、最初に出現する数字、つまり行番号を検索し(そのため、[[:digit:]]を使用しました)、SEDは一致したパターンを特殊文字&に自動的に格納します。2番目のステップでは、単語を挿入しますBook number 一致する各パターンの前、つまりすべての行の前。
別の例を見てみましょう。book.txtファイルでは、最後の桁は本のページ数を意味します。その前に「Pages =」を追加しましょう。これを行うには、数字の最後の出現箇所を見つけて、「Pages =&」に置き換えます。ここで、&は一致したパターン、つまりページ数を格納します
[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt
上記の構文を実行すると、次の結果が得られます。
1) A Storm of Swords, George R. R. Martin, Pages = 1216
2) The Two Towers, J. R. R. Tolkien, Pages = 352
3) The Alchemist, Paulo Coelho, Pages = 197
4) The Fellowship of the Ring, J. R. R. Tolkien, Pages = 432
5) The Pilgrimage, Paulo Coelho,Pages = 288
6) A Game of Thrones, George R. R. Martin, Pages = 864
とりあえず、覚えておいてください [[:digit:]]*$数字の最後の出現を見つけます。「正規表現」の章では、正規表現について詳しく説明します。