Como usar 'sed' com tubulação

18

Eu quero substituir uma string produzida em grep , tenho:

$ npm info webpack | grep version 

sai-me

$ version: '2.1.0-beta.12',

mas quero ter:

$ 2.1.0-beta.12

Então, acho que posso conseguir isso usando sed e substituir substrings desnecessários. Mas aqui vai a parte difícil para mim:

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

Como posso alcançar meu objetivo?

    
por Oskar Szura 02.08.2016 / 09:59

3 respostas

14

Se você for usar sed, não há necessidade de usar também o grep. Experimente:

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

Exemplo:

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

Alternativa: usando o awk

Da mesma forma, se usar o awk, não há necessidade de também grep:

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

Exemplo:

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

Como funciona:

  • -F"[ ',]+"

    Isso diz ao awk para usar espaços, aspas simples ou vírgulas ou qualquer combinação deles como separadores de campo.

  • /version:/{print $2}

    Se uma linha contiver version: , imprima o segundo campo.

por 02.08.2016 / 10:04
5

O comando sed substitute ( s ) espera um padrão de pesquisa e uma string de substituição. Você apenas forneceu um padrão de pesquisa. Você também deve citar as strings corretamente no shell:

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

Isso lhe dará o resultado '2.1.0-beta.12', , que não é exatamente o que você deseja.

Como a saída de grep é tão simples, você pode usar cut com o delimitador ' para obter o segundo campo da linha (sem a necessidade de expressões regulares complicadas):

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

Isso lhe dará 2.1.0-beta.12 .

Também adicionei -F a grep , pois a string que você procura é uma string fixa , não uma expressão regular.

    
por 02.08.2016 / 10:09
0

Primeiro, você pode tentar usar sed :

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

ou você pode usar awk :

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

que provavelmente é mais fácil.

    
por 02.08.2016 / 10:07

Tags