91 votes

Comment utiliser 'sed' avec les piping

Je veux remplacer une chaîne de caractères produite par grep Je l'ai fait :

$ npm info webpack | grep version 

il 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 sed et remplacer les sous-chaînes inutiles. Mais voici la partie la plus difficile pour moi :

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

Comment puis-je atteindre mon objectif ?

82voto

John1024 Points 15663

Si vous utilisez sed, il n'est pas nécessaire d'utiliser également grep. Essayez :

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 d'utiliser 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 cela fonctionne :

  • -F"[ ',]+"

    Ceci 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: puis imprimer le deuxième champ.

20voto

Kusalananda Points 2143

El sed commande 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 de caractères dans le Shell :

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

Vous obtiendrez ainsi le résultat suivant '2.1.0-beta.12', ce qui n'est pas tout à fait ce que vous voulez.

Puisque la sortie de grep est si 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 également ajouté -F a grep puisque la chaîne que vous recherchez est un chaîne fixe et non une expression régulière.

8voto

MariusMatutiae Points 45233

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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X