la sortie d’une commande est un argument d’un autre

Y a-t-il un moyen de tenir dans une ligne en utilisant les tuyaux suivants:

sortie de

sha1sum $(xpi) | grep -Eow '^[^ ]+' 

va au lieu de 456

 sed 's/@version@/456/' input.txt > output.txt 

Ce n’est pas possible en utilisant des tuyaux. L’imbrication des commandes fonctionne bien:

 sed 's/@version@/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+')'/' input.txt > output.txt 

Notez également que si les résultats de la commande nestede contiennent le caractère / , vous devrez utiliser un caractère différent comme séparateur ( # , | , $ et _ sont les plus populaires) ou échapper aux barres obliques de votre chaîne. Cette question de StackOverflow a également une solution au problème d’échappement. Le problème peut être résolu en redirigeant la commande vers sed et en remplaçant toutes les barres obliques (pour les caractères d’échappement) et les barres obliques inverses (pour éviter les conflits avec l’utilisation de / tant que délimiteur sed externe).

L’expression régulière suivante échappera à tous les caractères et à tous les caractères de la commande:

 sha1sum $(xpi) | grep -Eow '^[^ ]+' | sed -e 's/\(\/\|\\\|&\)/\\&/g' 

Comme nous l’avons fait ci-dessus, nous obtenons cette solution qui devrait correctement échapper les barres obliques si nécessaire:

 sed 's/@version@/'$(sha1sum $(xpi) | grep -Eow '^[^ ]+' | sed -e 's/\(\/\|\\\|&\)/\\&/g')'/' input.txt > output.txt 

Personnellement, je pense que cela ressemble à un désordre comme une ligne, mais ça marche.

Euh, je pense que vous pouvez imbriquer des occurrences de $ (commande arg arg), donc si vous avez vraiment besoin d’une seule ligne, essayez

  sed "s/@version@/$(sha1sum $(xpi) | grep -Eow '^[^ ]+')/" input.txt \ > output.txt 

Mais j’aime la solution de Trey en le plaçant sur deux lignes; c’est moins déroutant.