web-dev-qa-db-ja.com

一致が見つかったときに行全体をsedで置き換えます

パターンに一致する場合は、行全体をsedに置き換える必要があります。たとえば、行が「1 2 6 3 4」であり、「6」がある場合、行全体を「fault」に置き換える必要があります。

38
irek

次のいずれかでそれを行うことができます。

sed 's/.*six.*/fault/' file     # check all lines
sed '/six/s/.*/fault/' file     # matched lines -> then remove

sixを含む行全体を取得し、faultに置き換えます。

例:

$ cat file
six
asdf
one two six
one isix
boo
$ sed 's/.*six.*/fault/'  file
fault
asdf
fault
fault
boo

このソリューション から Sedを使用して文字列を含む行全体を置換 に基づいています

より一般的には、式sed '/match/s/.*/replacement/' fileを使用できます。これは、matchを含む行でsed 's/match/replacement/'式を実行します。あなたの場合、これは次のようになります:

sed '/six/s/.*/fault/' file

「1つ2つ6つ8つ11つ3つ4つ」があり、「悪い」単語として「8」と「11」を含めたい場合はどうでしょうか。

この場合、複数の条件に-eを使用できます。

sed -e 's/.*six.*/fault/' -e 's/.*eight.*/fault/' file

等々。

または:

sed '/eight/s/.*/XXXXX/; /eleven/s/.*/XXXX/' file
60
fedorqui

上記の答えは私にとってはうまくいきましたが、別の方法を言及しただけです

単一のパターンに一致し、新しいパターンに置き換えます。

sed -i '/six/c fault' file

複数のパターンに一致し、新しいパターンに置き換えます(コマンドを連結する):

sed -i -e '/one/c fault' -e '/six/c fault' file
5
Hasan Rumman

これはあなたのために働くかもしれません(GNU sed):

sed -e '/six/{c\fault' -e ';d}' file

または:

sed '/six/{c\fault'$'\n'';d}' file
3
potong