sed
私は最初に次のように検索して置き換える方法を学びました。
sed -e 's/<stuff>/<replacement>/'
しかし、最近、これらのコマンドが最初に使用したコマンド文字(ではなく)によってs
異なる操作を実行することがわかりました。たとえば、
sed -e 'g/<stuff>/<??>/'
スクリプトの冒頭で使用できるさまざまなコマンドは何sed
ですか、そのコマンドの機能は何ですか?
答え1
この回答には私以外の仕事が含まれているので、コミュニティウィキの投稿にしました。この回答に自由に参加してください。
見える文字をコマンドと呼びます。数十があります。これを完全に理解するには、まずsed
関連する構文と用語のいくつかを理解する必要があります。sed
用語(および用語を含む
pattern space
)の説明については、hold space
以下を参照してください。これStackOverflowの答えです。
sed構文は次のとおりです。
[address or range]command
改行またはセミコロンで区切って複数のコマンドを連続して実行できます(一部のコマンドは改行で区切る必要があります)。
コマンドには3つのタイプがあります。
- 住所や範囲を許可しません。
- 一つの住所を受け入れたり、まったく受け入れないこと。
- アドレス範囲を許可すること。
sed
以下のマンページでほぼ完全なコマンドのリストを見つけることができますsed(1)
。私はこれらのコマンドのより良い説明を提供するよう努めています。
0個のアドレスまたは1個のアドレスコマンド
これらは命令です
=
- 現在の行番号を印刷します。a \<text>
- 含まれている各改行の前にバックスラッシュが来るテキストを追加します。i \<text>
- バックスラッシュの前に挿入された各改行を使用してテキストを挿入します。q [exit-code]
- 追加の入力を処理せずに直ちにsedスクリプトを終了し、自動印刷が無効になっていない限り、現在のパターンスペースを印刷します。終了コードパラメータはGNU拡張です。Q [exit-code]
- 入力を処理せずにすぐにsedスクリプトを終了します。これはGNU拡張です。r filename
- ファイル名から読み取ったテキストを追加します。R filename
- ファイル名から読み取った行を追加します。このコマンドを呼び出すたびに、ファイルから1行を読み取ります。これはGNU拡張です。
アドレス範囲コマンド
b label
- labelに分岐し、labelを省略するとスクリプトの最後に分岐します。c \ text
- ここでいくつかの内容を置き換えます(マンページからインポートし、フォーマットされ、sed(1)
少し変更されました)。選択した行はテキストとして選択され、含まれている各改行の前にはバックスラッシュがあります。d
- パターンスペースを削除します。次のサイクルを開始してください。D
- パターンスペースに改行文字が含まれていない場合は、dコマンドが実行されたかのように通常の新しいループが開始されます。それ以外の場合は、パターン空間から最初の改行文字までテキストを削除し、新しい入力行を読み取らずに結果パターン空間を使用してループを再開します。h H
- パターンスペースをコピー/追加してスペースを節約します。g G
- 予約済みスペースをパターンスペースにコピー/追加します。l
- 「視覚的に明確な」形式で現在の行を一覧表示します。l <width>
- 現在の行を文字で区切って「視覚的に明確な」形式で一覧表示します。これはGNU拡張です。n N
- パターン空間に入力の次の行を読み取るか追加します。p
- 現在のパターンスペースを印刷します。P
- 現在のパターンスペースに最初に含まれている改行文字を印刷します。s/regexp/replacement/
- パターン空間の正規表現を一致させようとします。成功すると、交換と一致する部分が交換されます。代替項目には、パターン空間の一致する部分を表す特殊文字&、正規表現で一致する対応するサブ式を表す特殊エスケープ文字\ 1〜\ 9を含めることができます。t label
-s///
入力行が最後に読み込まれてからコマンドが正常に置き換えられた場合はラベルに分岐し、ラベルが省略された場合は最後のtまたはTコマンドの後にスクリプトの最後に分岐します。T label
-s///
入力行が最後に読み込まれてからラベルが省略された場合、スクリプトの最後まで分岐した最後のtまたはTコマンド以降に置換を正常に完了したコマンドがない場合は、ラベルに分岐します。これはGNU拡張です。w filename
- ファイル名に現在のパターン空間を書き込みます。W filename
- 現在のパターン空間の最初の行をファイル名に書き込みます。これはGNU拡張です。x
- ホールド空間とパターン空間の内容を交換します。y/source/dest/
- ソースに表示されるパターン空間の文字をターゲットの対応する文字に変換します。
これらのコマンドの詳細については、sedを参照してください。テキスト情報パンフレット。
範囲に関する注意
一部の sed コマンドは、アドレスまたはアドレス範囲を受け入れます。例えば、
sed 1p
sed 入力の最初の行を印刷します。
sed /foo/p
単語を含むすべての行を印刷しますfoo
。
sed /foo/,/bar/p
foo
からまでのすべての行を印刷しますbar
。これは複数回一致できます。例えば、
$ cat file
foo
baz
bar
baz
foo
bar
$ sed -n /foo/,/bar/p
印刷されます
foo
baz
bar
foo
bar