文字列を見つけて、2つのタグ間を削除して繰り返します。

文字列を見つけて、2つのタグ間を削除して繰り返します。

ファイル内の文字列を探して、その前のタグの最初のインスタンスを見つけて、そのタグと閉じるタグの間のすべてのエントリを削除してから、ファイルの残りの部分に対してこのプロセスを繰り返すにはどうすればよいですか?

私はこれを探していましたが、sed私が知っている限り、削除する行数を指定する必要があり、行数は2つのマーカーごとに異なる場合があります。

答え1

タグがネストされていないと仮定します。

perl -0777 -pe 's{<tag>.*?</tag>}{
  my $r = $&; $r =~ /string/ ? "" : $r}gse' < "$file"

答え2

あなたできるこれを行いますsed。アイデアは、毎回ラベルの間に行を重ねることです。スタックに文字列が含まれている場合は削除し、それ以外の場合は印刷します。

sed ':n
/<tag1>.*string.*<tag2>/d;$q;N
/<tag1>.*<tag2>/!bn'

ファイルが非常に大きい場合、またはより正確には、タグ1と2の間に多数のファイルがある場合、またはその逆の場合、このコマンドは面倒または扱いにくい場合があります。より多くのコードを使用すると、これらの状況を処理するように最適化することができ、GNUはsedほとんどの場合困難を経験しません。

関連情報