一致するものが見つかるたびに、前の行を印刷したい。 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;}
、残りのすべての年齢を受け入れるようになりました。