最初のパターンを除くすべてのパターンを削除します。

最初のパターンを除くすべてのパターンを削除します。

コードジェネレータの出力をクリーンアップしようとしています。残念ながら、複数のインポートが生成されます。

import Foo
...
import Foo

幸いにも、生成されたテキストは頻繁に再生成されますが、比較的静的であるため、簡単に削除する方法があることを願っています。

私は彼らが同じ行にいる場合は、次のことができることがわかりました。sed 's/import Foo//2g'

しかし、私はすべての行を考慮するためにsedについて十分に知りません。

ハッキーソリューションは複数のsedを実行することです。

sed 's/\n/<string I know doesn't appear>/g'
sed 's/import Foo//2g'
sed 's/<string I know doesn't appear>/\n'

しかし、そうするのは間違っているようです。もっと良い方法がありますか?

ベストアンサー1

sed '/^import Foo$/{x;/^$/!d;g;}'

仕組み:パターンに一致するすべての行で

  • x:予約済みスペースに行を交換します。
  • /^$/!d:保存スペースで得たコンテンツが空でない場合です。前の一致がそこに保存されているので、パターンを削除して次の行に進みます。
  • g:そうでない場合(つまり、最初のパス)、保存された行を再コピーします。デフォルトでは印刷されます。

おすすめ記事