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/'
含まれておらず、ファイルが空でない限り機能します。foo
bar
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
これの利点は、明確さとメンテナンスの容易さです。