sedスクリプトはパターンを含むすべての行を削除し、最後に行を追加します。

sedスクリプトはパターンを含むすべての行を削除し、最後に行を追加します。

fooファイルがまたはを含む複数行に複雑になりましたbar。すべて削除して最後に1行追加します。

だから与えられたファイル

some stuff
foo1
foo2
bar=42
some other stuff
bar
foo
more stuff

sedスクリプトを返す必要があります。

some stuff
some other stuff
more stuff
foo
bar

sedを試してみましたが、最後の行に両方が'/foo/d;/bar/d;$s/$/\nfoo\nbar/'含まれておらず、ファイルが空でない限り機能します。foobar

foo最後の行でも機能させるにはどうすればよいですか?スクリプト全体がこれ以上の作業を行う必要があるので、私はsedを使い続けたいと思います。もちろん、スクリプトの後にechoを含む行を追加することもできますが、オールインワンソリューションがないかどうか疑問に思います。

編集する:空のファイルボックスは処理する必要はありません。

答え1

2番目の条件を追加する必要があります。最後の行でない場合にのみ削除し、a一致後に行を削除するには、置換の代わりに最後の行に保留を使用します。

sed -E '/foo|bar/{$!d
}
${a\
foo\
bar
//d
}' infile

答え2

( sed -e '/foo/d' -e '/bar/d' data.in; cat <<END
foo
bar
END
) >data.out

不要な行を削除しsed、必要な末尾の行を追加してcat新しいファイルに出力します。

またはprintf代わりに使用してくださいcat

( sed -e '/foo/d' -e '/bar/d' data.in; printf 'foo\nbar\n' ) >data.out

または2段階で、

sed -e '/foo/d' -e '/bar/d' data.in >data.out
printf 'foo\nbar\n' >>data.out

これの利点は、明確さとメンテナンスの容易さです。

関連情報