GNU/Linux >> Linux の 問題 >  >> Linux

Sedを使用してパターンマッチ後に前の行を印刷しますか?

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


Linux
  1. Sedを使用してパターン範囲間の行を検索および置換

  2. カスタム正規表現区切り文字を使用してパターンを含む行番号を見つけますか?

  3. Sedコマンドを使用した後にファイルを保存しますか?

  1. bashを使用して、ファイルの各行の先頭にある空白を削除します

  2. 最初の一致でのみ挿入する sed

  3. sedにおける「ホールド空間」と「パターン空間」の概念

  1. シェルスクリプトを使用して、指定されたパターンの後にファイルに複数の行を挿入します

  2. 条件が満たされた場合、前の行を印刷します

  3. sed - 一致後に X 行の後に行を挿入する