web-dev-qa-db-fra.com

remplacer une chaîne inconnue entre deux chaînes connues par sed

J'ai un fichier avec le contenu suivant:

Word1 Word2 Word3

Comment puis-je utiliser sed pour remplacer la chaîne entre Word1 et Word3 par foo, de sorte que le contenu du fichier soit modifié comme suit?:

Word1 foo Word3

J'ai essayé ce qui suit, mais il me manque évidemment quelque chose car cela ne produit pas les résultats souhaités:

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

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

ou

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

Vous devrez peut-être vous échapper entre parenthèses, cela dépend de votre variante sed.

26
vyegorov

Cela pourrait fonctionner pour vous:

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

ou peut-être:

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

Si Word1 et Word3 se produit plusieurs fois:

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

contenu d'un échantillon file.txt

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

(Correction par @ DennisWilliamson en commentaire)
$ sed -e 's/\([^ ]\+\) \+\([^ ]\+\) \+\(.*\)/\1 foo \3/' file.txt

Word1 foo Word3
Word4 foo Word6
Word7 foo Word9

tandis que awk est en quelque sorte plus simple

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

Word1 foo Word3
Word4 foo Word6
Word7 foo Word9
3
Rony