sedのPコマンドはどのように機能しますか?

sedのPコマンドはどのように機能しますか?

sed 状態に関する文書

現在のパターンスペースに最初に含まれている改行文字を印刷します。

私はいくつかの実験をしてそれを理解しようとしました。以下は私のテストです。

root:[~]# seq 3 | sed -n '/2/{iline1\nline2;P}'
sed: -e expression #1, char 0: unmatched `{'
root:[~]#

ここでは、-nパターンスペースの自動印刷は無効になります。/2/を含む2行目と一致します2。したがって、2行目が一致すると、パターンスペースに内容があります2。このiコマンドは、line1\nline2パターン空間の先頭に改行文字を挿入します。したがって、パターンスペースにはコンテンツが必要ですline1\nline2\n2。今すぐP注文最初の新しい行で印刷したがって、line1印刷する必要があり、完全なコマンドの結果でなければなりません。私の理解は正しいですか?エラーが発生するのはなぜですか?よろしくお願いします。

答え1

このiコマンドはパターン空間に何も挿入しません。標準出力にテキストを書き込みます。

より良い例は次のとおりです。

$ cat file
line 1
line 2
line 3
line 4
$ sed -n 'N;P' file
line 1
line 3

このsedスクリプトはパターン空間として1行を読み込みます。このNコマンドは、パターン空間に次の入力行を追加し、その間に改行文字を挿入します。挿入された改行文字のパターンスペースPに最初の行を書き込みます。N次のサイクルが始まります(サイクルが終わると出力がないため-n)。

答え2

エラー:textコマンドの後にリテラル(バックスラッシュなし)改行文字を追加する必要がありますi。 GNU sedでは脱出できます

seq 3 | sed -n -e '/2/{iline1\nline2' -e 'P}'

\n改行文字を脱出したのと同じです。

それ以外の場合:

seq 3 | sed -n '/2/{i\
line1\
line2
P;}'

あなたの声明によれば、iコマンドはパターン空間ではなく出力ファイルに「挿入」されます。修正された例では、パターンスペースは2で、P改行文字が含まれていないため、全体が印刷されます。

通常、GNU sedマンページは混乱しており、GNU拡張のみを参照できます。私はお勧めします基準、より読みやすいです。

[1addr]i\
text
       Write text to standard output.
[2addr]P
       Write the pattern space, up to the first <newline>, to standard
       output.

関連情報