web-dev-qa-db-fra.com

comment utiliser xargs avec sed dans le modèle de recherche

J'ai besoin d'utiliser le résultat d'une commande comme motif de recherche dans sed. Je vais faire un exemple en utilisant echo, mais supposons que cela puisse être une commande plus compliquée:

echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt

Cette commande ne fonctionne pas parce que "certains modèles" ont un espace, mais je pense que cela illustre clairement mon problème.

Comment puis-je faire en sorte que cette commande fonctionne?

Merci d'avance,

13
Neuquino

Utilisez la substitution de commande à la place, votre exemple ressemblerait à ceci:

sed -i "s/$(echo "some pattern")/replacement/g" file.txt

Les guillemets doubles permettent à la substitution de commande de fonctionner tout en empêchant le fractionnement des espaces.

6
Steve

Vous devez dire à xargs quoi remplacer par le commutateur -I - il ne semble pas connaître le {} automatiquement, du moins dans certaines versions.

echo "pattern" | xargs -I '{}' sed -i 's/{}/replacement/g' file.txt
18
Weetu

cela fonctionne sur Linux (testé):

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g' 
6
alex

Cela pourrait fonctionner pour vous (GNU sed):

echo "some pattern" | sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt

Transformez essentiellement le some pattern en une commande sed substitution et transmettez-le via un tuyau à une autre invocation sed. La dernière invocation de sed utilise le commutateur -f qui accepte les commandes sed via un fichier, le fichier étant dans ce cas l'entrée standard -.

Si vous utilisez bash, le here-string peut être utilisé:

<<<"some pattern" sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt

N.B. les séparateurs sed | et / ne doivent pas faire partie de some pattern, sinon l'expression rationnelle ne sera pas formée correctement.

0
potong