nコマンドは、まず現在のパターンスペースを出力し、続いて次の入力行をパターンスペースに上書きしつつ、スクリプトの最初には戻らずにnコマンド以降の処理を続ける。複数行の条件分岐に使える。
n
コマンドは、次の行をパターンスペースに読み込んで残りのスクリプトを続けるのがポイント。その際、--quiet
により出力抑制をしていなければ、次の行を読み込む前に現在のパターンスペースを出力する。
まず、次は出力抑制があるので何も表示しない。
echo 'A' | sed --quiet 'n'
次は、--quiet
の出力抑制はp
や=
コマンドに対しては効かないので、
input='1A
2A
3A'
script='
s/A/X/
p
n
p
='
echo "$input" | sed --quiet "$script"
出力はこうなる。
1X 2A 2 3X
上記のように1回目のn
コマンドの後、次の行のサイクルは冒頭に戻らず残りのスクリプトを続ける。だから=
コマンドは2行目のことを意味する。また、2回目のn
コマンドに達したときは最終行であり、最終行になったn
コマンドは残りのスクリプトを続けずに即時終了する。
n
コマンドにより、前の行が特定のアドレスにマッチする場合のみ現在の行を処理するという、複数行における条件が使える。
パターンスペースが複数行になるわけではないので、複数行のパターンマッチならNコマンドへ。
input='第1章
あいうえお
第2章
かきくけこ'
script='
/^第[0-9]+章/ {
n
/^$/ d # 空行削除
}'
# 拡張正規表現
echo "$input" | sed --regexp-extended "$script"
上記は、「第何章」のすぐ次の行が空行ならば空行を削除するというスクリプト。出力はこうなる。
第1章 あいうえお 第2章 かきくけこ