Come usare 'sed' con tubazioni


34

Voglio sostituire una stringa emessa da grep, ho:

$ npm info webpack | grep version 

mi fa uscire

$ version: '2.1.0-beta.12',

ma voglio avere:

$ 2.1.0-beta.12

Quindi penso che potrei ottenerlo usando sede sostituendo sottostringhe non necessarie. Ma ecco la parte difficile per me:

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

Come posso raggiungere il mio obiettivo?

Risposte:


30

Se stai per usare sed, non è necessario usare anche grep. Provare:

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

Esempio:

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

Alternativa: usare awk

Allo stesso modo, se usiamo awk, non è necessario anche grep:

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

Esempio:

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

Come funziona:

  • -F"[ ',]+"

    Questo dice a awk di usare spazi, virgolette singole o virgole o qualsiasi loro combinazione come separatori di campi.

  • /version:/{print $2}

    Se una riga contiene version:, quindi stampare il secondo campo.


2
L' -Eopzione ovviamente significa usare la sintassi ERE, ma il mio manuale GNU sed 4.2.2 menziona solo -r. -Efunziona, però!
Legge 29

2
@ Law29 Sì. Per tutte le sedute GNU ragionevolmente moderne, tuttavia, -Eè un sinonimo non documentato-r . Si dice che POSIX abbia optato per -E, che BSD / OSX già utilizza, e, se aggiunto allo standard finale, passeremo tutti -E.
Giovanni 1024,

6

Il sedcomando substitute ( s) prevede un modello di ricerca e una stringa di sostituzione. L'hai fornito solo con un modello di ricerca. Dovresti anche citare correttamente le stringhe nella shell:

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

Questo ti darà il risultato '2.1.0-beta.12',, che non è proprio quello che vuoi.

Poiché l'output da grepè così semplice, è possibile utilizzare cutcon il delimitatore 'per ottenere il secondo campo della riga (senza la necessità di espressioni regolari complicate):

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

Questo ti darà 2.1.0-beta.12.

Ho anche aggiunto -Fa greppoiché la stringa che cerchi è una stringa fissa , non un'espressione regolare.


1

Innanzitutto, puoi provare a usare sed:

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

oppure puoi usare awk:

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

che è probabilmente più facile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.