nコマンド

nコマンドは、まず現在のパターンスペースを出力し、続いて次の入力行をパターンスペースに上書きしつつ、スクリプトの最初には戻らずに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コマンドは残りのスクリプトを続けずに即時終了する。


    1行前がこうだったら、次の行をこうする

    nコマンドにより、前の行が特定のアドレスにマッチする場合のみ現在の行を処理するという、複数行における条件が使える。

    パターンスペースが複数行になるわけではないので、複数行のパターンマッチならNコマンドへ。

    input='第1章
      あいうえお
    
    第2章
    
      かきくけこ'
    
    script='
    /^第[0-9]+章/ {
      n
      /^$/ d # 空行削除
    }'
    
    # 拡張正規表現
    echo "$input" | sed --regexp-extended "$script" 
    

    上記は、「第何章」のすぐ次の行が空行ならば空行を削除するというスクリプト。出力はこうなる。

    第1章
      あいうえお
    
    第2章
      かきくけこ