Cómo usar 'sed' con tuberías

34

Quiero reemplazar una cadena de salida grep, tengo:

$ npm info webpack | grep version 

me da salida

$ version: '2.1.0-beta.12',

pero quiero tener:

$ 2.1.0-beta.12

Así que creo que podría lograrlo usando sedy reemplazando subcadenas innecesarias. Pero aquí va la parte difícil para mí:

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

¿Cómo puedo lograr mi objetivo?

Oskar Szura
fuente

Respuestas:

30

Si va a usar sed, no hay necesidad de usar también grep. Tratar:

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

Ejemplo:

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

Alternativa: usar awk

Del mismo modo, si usamos awk, no hay necesidad de grep también:

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

Ejemplo:

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

Cómo funciona:

  • -F"[ ',]+"

    Esto le dice a awk que use espacios, comillas simples o comas o cualquier combinación de ellas como separadores de campo.

  • /version:/{print $2}

    Si una línea contiene version:, imprima el segundo campo.

John1024
fuente
2
La -Eopción obviamente significa usar la sintaxis de ERE, pero mi manual de GNU sed 4.2.2 solo menciona -r. -Efunciona, sin embargo!
Ley 29 de
2
@ Law29 Sí. Para todos GNU bastante moderna del sed, sin embargo, -Ees un indocumentado sinónimo de -r. El rumor es que POSIX se ha decidido -E, que BSD / OSX ya usa, y, si eso se agrega al estándar final, todos haremos la transición -E.
John1024
6

El sedcomando sustituto ( s) espera un patrón de búsqueda y una cadena de reemplazo. Solo le proporcionó un patrón de búsqueda. También debe citar cadenas correctamente en el shell:

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

Esto te dará el resultado '2.1.0-beta.12', , que no es exactamente lo que desea.

Como el resultado de grepes tan simple, puede usarlo cutcon el delimitador 'para obtener el segundo campo de la línea (sin la necesidad de expresiones regulares complicadas):

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

Esto te dará 2.1.0-beta.12.

También he añadido -Fa la grepya que la cadena se busca es una cadena fija , no una expresión regular.

Kusalananda
fuente
1

Primero, puede intentar usar sed:

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

o puedes usar awk:

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

lo cual es probablemente más fácil

MariusMatutiae
fuente