一致するものが見つかるたびに前の行を印刷したいと思います。理解grep -A
して-B
選択します。しかし、私のSolaris 5.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
。
私の環境はSolaris 5.10。
ベストアンサー1
$ sed -n '/age is : 10/{x;p;d;}; x' Foo.txt
Name is : sara
Name is : Ron
上記はGNU sedでテストされました。 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;}
期間をすべて受け入れます。