Comment utiliser 'sed' avec de la tuyauterie

34

Je veux remplacer une chaîne de sortie 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

Je pense donc que je pourrais y parvenir en utilisant sedet en remplaçant 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 atteindre mon objectif?

Oskar Szura
la source

Réponses:

30

Si vous allez utiliser sed, il n'est pas nécessaire 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 grep également:

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.

John1024
la source
2
L' -Eoption signifie évidemment utiliser la syntaxe ERE, mais mon manuel GNU sed 4.2.2 mentionne seulement -r. -Efonctionne, cependant!
Loi29
2
@ Law29 Oui. Cependant, pour tout GNU raisonnablement moderne, sed -Eest un synonyme non documenté-r . La rumeur est que POSIX s'est installé -E, que BSD / OSX utilise déjà, et, si cela est ajouté à la norme finale, nous passerons tous à -E.
John1024
6

La sedcommande de substitution ( s) attend un modèle de recherche et une chaîne de remplacement. Vous ne lui avez fourni qu'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.

Étant donné que la sortie de grepest si simple, vous pouvez utiliser cutavec 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 également ajouté -Fà greppuisque la chaîne que vous recherchez est une chaîne fixe , pas une expression régulière.

Kusalananda
la source
1

Tout d'abord, 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.

MariusMatutiae
la source