GNU sedモード

GNU sedモード

file_a.txtというテキストファイルがあります。私の最初のコマンドは

grep -A 12 ".production =" file_a.txt

出力は複数のブロックです。各文字列ブロックには13行が含まれています。

grep具体的には、元のファイルfile_a.txtからコマンドを使用して取得したすべての文字列ブロックを削除したいと思います。 grep出力を新しいファイルに送信したくありません。grep -v私の場合はうまくいかないので、どちらかを使用したくありません。

同様のことを試しましたが、何も機能しません。

cut < grep -A 12 ".production =" file_a.txt

sed -i '/`grep -A 12 ".production ="`/d' file_a.txt

ベストアンサー1

GNU sedモード

(一部のLinuxディストリビューションを使用している場合はデフォルトの実装でGNU sedある必要がありますsed)次のように使用できます。

sed '/.production =/,+12d' inputfile.txt

仕組み:

  1. 入力ファイルを1行ずつスキャンし(sedが機能する方法)、コマンドを使用する必要があるかどうかを確認します。
  2. 私たちのコマンドはd(最後の文字)です。これは行削除を意味します。
  3. ただし、このコマンドは現在の行が範囲と一致する場合にのみ実行されます。
  4. 範囲は、範囲の始まりと終わりを含む文字で区切られた2つのパラメーターで指定されます,。 1つ目は、/.production =/式を含むすべての行に一致する正規表現です。 2番目のパラメータ+12dはを意味します12 lines from start range
  5. したがって、範囲は式に一致するすべての行と次の12行を一致させて削除します。
  6. 他のすべての行は出力として印刷されます(デフォルトsed behaviour)。

ポータブル、醜い方法

これは他のsed実装と連携する必要がありますが、より多くの入力が必要で強力ではありません。

sed '/.production =/{N;N;N;N;N;N;N;N;N;N;N;N;d}' somefile.txt

仕組み:

  1. 入力ファイルを1行ずつスキャンし(sedが機能する方法)、コマンドを使用する必要があるかどうかを確認します。
  2. /.production =/線がパターンと一致していることを確認してください。その場合は、中かっこで囲まれたすべてのコマンドを実行します{}
  3. 私たちはNコマンドを12回実行しました。Nこのコマンドは次の行を読み取り、それを現在のバッファに追加します。したがって、12回実行した後、13行が現在バッファに接続されます(最初の行+Nコマンドで読み取られた12行)。
  4. d次に、リンクされている13行を削除するコマンドを実行します。
  5. sed別のパターンが見つかるまで続行し、13行目をもう一度削除します。他のすべての行は印刷されます(デフォルトのsed動作)。

おすすめ記事