11 votes

Remplacement d'une chaîne de caractères par un fichier à l'aide de Sed

Disons que j'ai deux fichiers foo y bar . Je veux remplacer la chaîne " ceci est un test " dans foo avec le contenu du fichier bar . Comment puis-je faire cela en utilisant une seule ligne ? sed ?

J'ai utilisé :

sed -i.bak 's/this is test/$(cat bar)\n/g' foo 

mais la chaîne de caractères est remplacée par le littéral $(cat bar) plutôt que le contenu de bar . J'ai essayé d'utiliser des guillemets mais le résultat reste le même.

La réponse de Radu est correcte en ce qui concerne la citation. Maintenant, le problème est le suivant : disons que mon fichier de barres contient.. :

this
is
a
test
file

Maintenant, si j'exécute la commande, cela donne une erreur :

sed : -e expression #1, char 9 : commande `s' non terminée

18 fois.

10voto

Radu Rădeanu Points 156862

La commande suivante devrait fonctionner pour ce que vous voulez :

sed "s/this is test/$(cat bar)/" foo

Si foo contient plus d'une ligne, alors vous pouvez utiliser :

sed "s/this is test/$(sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' bar | tr -d '\n')/" foo

ou :

sed -e '/this is a test/{r bar' -e 'd}' foo

Source des deux dernières commandes : Remplacer un motif dans un fichier par le contenu d'un autre fichier.

Pour effectuer le changement dans foo utilisez sed -i .

6voto

Guru Points 699

Un moyen :

sed -e '/this is test/r bar' -e '/this is test/d' foo

Résultat de l'échantillon :

$ cat bar
12
23
$ cat foo
ab
this is test
cd
this is test
ef
$  sed -e '/this is test/r bar' -e '/this is test/d' foo
ab
12
23
cd
12
23
ef

1voto

aleb Points 126

Lorsque vous devez remplacer une ligne entière par le contenu d'un fichier, vous pouvez utiliser la fonction r pour insérer un fichier et d pour supprimer la ligne en cours :

sed -e "/regex/{r/path/to/file" -e "d}"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X