web-dev-qa-db-fra.com

Comment utiliser 'sed' avec la tuyauterie

Je veux remplacer une chaîne sortie de grep, j'ai:

$ npm info webpack | grep version 

ça me sort

$ version: '2.1.0-beta.12',

mais je veux avoir:

$ 2.1.0-beta.12

Donc, je pense que je pourrais y parvenir en utilisant sed et remplacer les sous-chaînes inutiles. Mais voici la partie difficile pour moi:

$ npm info webpack | grep version: | sed s/version: /
sed: -e expression #1, char 10: unterminated `s' command

Comment peut atteindre mon objectif?

26
Oskar Szura

Si vous utilisez sed, vous n'avez pas besoin d'utiliser également grep. Essayer:

npm info webpack | sed -En "s/version: '(.*)',/\1/p"

Exemple:

$ echo  "version: '2.1.0-beta.12'," | sed -En "s/version: '(.*)',/\1/p"
2.1.0-beta.12

Alternative: utiliser awk

De même, si nous utilisons awk, il n’est pas nécessaire de mettre aussi grep:

npm info webpack | awk -F"[ ',]+" '/version:/{print $2}'

Exemple:

$ echo  "version: '2.1.0-beta.12'," | awk -F"[ ',]+" '/version:/{print $2}'
2.1.0-beta.12

Comment ça marche:

  • -F"[ ',]+"

    Cela indique à awk d'utiliser des espaces, des guillemets simples, des virgules ou toute combinaison de ceux-ci comme séparateurs de champs.

  • /version:/{print $2}

    Si une ligne contient version:, imprimez le deuxième champ.

22
John1024

La commande sed substitute (s) attend un modèle de recherche et une chaîne de remplacement. Vous ne l'avez fourni qu'avec un modèle de recherche. Vous devez également citer correctement les chaînes dans le shell:

$ npm info webpack | grep 'version:' | sed 's/version: //'

Cela vous donnera le résultat '2.1.0-beta.12',, ce qui n’est pas tout à fait ce que vous voulez.

Puisque la sortie de grep est très simple, vous pouvez utiliser cut avec le délimiteur ' pour obtenir le deuxième champ de la ligne (sans avoir besoin d'expressions régulières compliquées):

$ npm info webpack | grep -F 'version:' | cut -d "'" -f 2

Cela vous donnera 2.1.0-beta.12.

J'ai aussi ajouté -F à grep puisque la chaîne que vous recherchez est une chaîne fixed , et non une expression régulière.

6
Kusalananda

Premièrement, vous pouvez essayer d’utiliser sed:

npm info webpack | grep version: | sed 's/version: //'

ou vous pouvez utiliser awk:

npm info webpack | grep version: | awk '{print $2}'

ce qui est probablement plus facile.

1
MariusMatutiae