パターンマッチング後に前の行を印刷するためにsedを使用しますか?

パターンマッチング後に前の行を印刷するためにsedを使用しますか?

一致するものが見つかるたびに前の行を印刷したいと思います。理解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;}期間をすべて受け入れます。

おすすめ記事