Sed-special-characters

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

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

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ファイルの各行には番号が付けられています。 各行の先頭に「書籍番号」という言葉を追加しましょう。 次の例はこれを示しています。

[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: $ *は最後に見つかった数字を見つけることを覚えておいてください。 「正規表現」の章では、正規表現について詳しく説明します。