
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.