web-dev-qa-db-ja.com

2つの既知の文字列の間の未知の文字列をsedに置き換えます

次の内容のファイルがあります。

Word1 Word2 Word3

ファイルの内容が次のように変更されるように、sedを使用してWord1とWord3の間の文字列をfooに置き換えるにはどうすればよいですか?:

Word1 foo Word3

私は次のことを試しましたが、それが望ましい結果をもたらさないので、明らかに何かが欠けています:

sed -i '' 's/Word1.*Word3/foo/g' file.txt

22
Camden S.
sed -i 's/Word1.*Word3/Word1 foo Word3/g' file.txt

または

sed -i 's/(Word1).*(Word3)/\1 foo \2/g' file.txt

Sedバリアントによっては、丸括弧をエスケープする必要がある場合があります。

26
vyegorov

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

sed 's/\S\+/foo/2' file

多分:

sed 's/[^[:space:]][^[:space:]]*/foo/2' file

Word1およびWord3は2回以上発生します。

echo "Word1 Word2 Word3 BLA BLA Word1 Word4 Word3" |
sed 's/Word3/\n&/g;s/\(Word1\)[^\n]*\n/\1 foo /g'
Word1 foo Word3 BLA BLA Word1 foo Word3
6
potong

サンプルの内容_file.txt_

_$ cat file.txt 
Word1 Word2 Word3
Word4 Word5 Word6
Word7 Word8 Word9
_

@ DennisWilliamson コメントによる修正)
$ sed -e 's/\([^ ]\+\) \+\([^ ]\+\) \+\(.*\)/\1 foo \3/' file.txt

_Word1 foo Word3
Word4 foo Word6
Word7 foo Word9
_

awkはやや単純ですが

_$ awk -F' ' '{ print $1" foo "$3 }' file.txt_

_Word1 foo Word3
Word4 foo Word6
Word7 foo Word9
_
3
Rony