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?

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.


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.