web-dev-qa-db-ja.com

sedを使用して特定の単語の後にテキストを置き換えるにはどうすればよいですか?

.ignoreという名前のファイルがあります。 projdirを置き換える必要があります。例えば:

ignore \..*
ignore README
projdir Snake

Snakeを「PacMan」などに置き換える必要があります。 manページを読みましたが、どうすればよいかわかりません。

12

projdirで始まる行を検索し、行全体を新しい行で置き換えます。

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^および$は行頭/行末マーカーなので、パターンは行全体に一致します。 .*はすべてに一致します。 -iは、変更を単に出力するのではなく、直接.ignoreに書き込むようにsedに指示します

18
Michael Mrozek

1つのアプローチは、保持したい部分の後方参照を使用して、行全体を書き直すことです。

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

別のアプローチは、行のその部分を書き換えることですが、他の部分が一致する場合のみです。

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

どちらの例も、最初のWordがprojdirである行の2番目の空白区切りのWordを書き換えます。

これは古い投稿であり、受け入れられた回答で解決されたようですが、実際の質問には回答されていません。完全性のために、そして他者を助けるために:

ここでは、「Snake」に実際に一致し、「projdir」で始まる行には一致しない答え...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

これにより、「Snake」を含む行の最初からすべてが「Snake」+「PacMan」の前のすべてに置き換えられます。\1は()内で一致するものを表します。 「Snake」以降はすべてそのままです。

3
moritz
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdirは、文字列projdirで始まる行を検索します。そこの。* $は、同じ行の行のprojdirの後の文字列を表します。文字列projdir PacManは、置き換える文字列です。 gはグローバルです。projdirで始まるすべての行を置き換えます。 .ignoreはファイルの名前です

1
Tinu