結果:

結果:

連続していないパターンを特定する方法...

このコマンドを実行します。

grep -B 1 -A 2 "field-2-value" inputFile.txt |grep -v "field-3"

この4つの出力を生成します。

  [フィールド-1]xxx[/フィールド-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [フィールド-5]真[/フィールド-5]
  -
  [フィールド-1]yyy[/フィールド-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [フィールド4]フィールド4値[/フィールド4]
  -
  [フィールド-1]zzz[/フィールド-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [フィールド-5]偽[/フィールド-5]
  -
  [field-1]うーん[/field-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [フィールド4]フィールド4値[/フィールド4]

私はfield-2とfield-4の値を使用した2番目と最後の結果にのみ興味があります。

 
  [フィールド-1]yyy[/フィールド-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [フィールド4]フィールド4値[/フィールド4]

  [field-1]うーん[/field-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [フィールド4]フィールド4値[/フィールド4]

inputFile.txt は次のようになります。

[レコードID = "1"]
  [フィールド-1]xxx[/フィールド-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [field-3]こんにちは[/field-3]
  [フィールド-5]真[/フィールド-5]
[/記録]
[レコードID="2"]
  [フィールド-1]yyy[/フィールド-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [field-3]こんにちは[/field-3]
  [フィールド4]フィールド4値[/フィールド4]
[/記録]
[レコードID="3"]
  [フィールド-1]zzz[/フィールド-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [field-3]こんにちは[/field-3]
  [フィールド-5]偽[/フィールド-5]
[/記録]
[レコードID="4"]
  [field-1]うーん[/field-1]
  [フィールド2]フィールド2の値[/フィールド2]
  [field-3]こんにちは[/field-3]
  [フィールド4]フィールド4値[/フィールド4]
[/記録]

2つのワークセットを実行するシェルスクリプトを作成したいのです。まず、これらの結果を含む各ファイルに対して、これらの出力を含むファイルを生成します。次に、フィールド4を持たない行ブロックを削除します。助ける!

答え1

sed -ne '
   /field-2-value/!{h;d;}
   H;n;n;/field-4/!d;H;g;s/$/\n/p
' inputFile.txt

/field-2/ を含まないすべての行を拒否し、保存アクションに保存します。 (最後のもののみ保存可能)

したがって、/field-2/行が表示されたら、それを追加して保留し、次の行をスキップしてから、次の行に/field-4/が含まれていることを確認します。そうでない場合は、OTWに入れて保留に追加し、保留を外に移動し、印刷されたレコードが分離されるように末尾の改行を追加して印刷します。


結果:

  [field-1]yyy[/field-1]
  [field-2]field-2-value[/field-2]
  [field-4]field-4-value[/field-4]

  [field-1]mmm[/field-1]
  [field-2]field-2-value[/field-2]
  [field-4]field-4-value[/field-4]

関連情報