一致するものが見つかるたびに、前の行を印刷したい。 grep -Aについて知っています および-B オプション。しかし、私のSolaris5.10マシンはこれらのオプションをサポートしていません。
sedのみを使用したソリューションが必要 。
Foo.txt :
Name is : sara
age is : 10
Name is : john
age is : 20
Name is : Ron
age is : 10
Name is : peggy
age is : 30
Out.txt :
Name is : sara
Name is : Ron
私が一致させようとしているパターンはage is : 10でした 。
私の環境、Solaris5.10。
承認された回答:
$ sed -n '/age is : 10/{x;p;d;}; x' Foo.txt
Name is : sara
Name is : Ron
上記はGNUSedでテストされました。 Solarisのsedがセミコロンと一緒にコマンドを連鎖させることをサポートしていない場合は、次のことを試してください。
$ sed -n -e '/age is : 10/{x;p;d;}' -e x Foo.txt
Name is : sara
Name is : Ron
仕組み
sedにはホールドスペースとパターンスペースがあります。改行はパターンスペースに読み込まれます。このスクリプトの考え方は、前の行が保留スペースに保存されることです。
-
/age is : 10/{x;p;d;}現在の行に
age is : 10が含まれている場合 、次に実行します:x:パターンを入れ替えてスペースを保持し、前の行がパターンスペースに収まるようにしますp:前の行を印刷するd:パターンスペースを削除し、次の行の処理を開始します -
xこれは、
age is : 10を含まない行でのみ実行されます。 。この場合、現在の行が保留スペースに保存されます。
反対のことをする
年齢がではない人の名前を印刷するとします。 10:
$ sed -n -e '/age is : 10/{x;d}' -e '/age is :/{x;p;d;}' -e x Foo.txt
Name is : john
Name is : peggy
上記は最初にコマンドを追加します。/age is : 10/{x;d} 、10歳を無視します。次のコマンド、/age is :/{x;p;d;} 、残りのすべての年齢を受け入れるようになりました。