2017-11-07 4 views
1

SEDがMacOSのとLinux上で私を失敗している:sedはファイルの最初の行とアドレス範囲の最後を一致させることができませんか?

$ printf "1\n2\n3" | sed -n -e '1,1p'  
1 
$ printf "1\n2\n3" | sed -n -e '1,/1/p' 
1 
2 
3 

/1 /終了アドレス範囲パターンは動作しません。/2 /それでも。 (あなたの)BSD sed例、範囲を開始し、/1/はそれを閉じますが、唯一の後の行1(範囲開始)/1/開始の検索1ラインで

printf "1\n2\n3" | sed -n -e '1,/2/p' 
1 
2 

答えて

2

GNU sedには、正確な大文字と小文字を扱う拡張子、0,/regexp/ range addressがあります。ドキュメントには、最高のそれを説明する:

0,/regexp/sed最初の入力行にすぎを正規表現に一致するようにしようとするように0の行番号が0,/regexp/のようなアドレス指定に使用することができます。言い換えれば、0,/regexp/は、addr2が入力の最初の行と一致する場合、1,/regexp/と似ていますが、1,/regexp/形式はその範囲の先頭と一致し、範囲が上がるようになりますが、0,/regexp/形式は範囲を終了するとみなします。 2番目の正規表現の出現まで例えば

$ printf "%d\n" {1..3} | sed -n -e '0,/1/p' 
1 
関連する問題