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,
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.
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
cela fonctionne sur Linux (testé):
find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'
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.