Como usar 'sed' com tubulação


34

Eu quero substituir uma string de grep, tenho:

$ npm info webpack | grep version 

isso me mostra

$ version: '2.1.0-beta.12',

mas eu quero ter:

$ 2.1.0-beta.12

Então, acho que posso conseguir isso usando sede substituindo substrings desnecessários. Mas aqui vai a parte mais 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?

Respostas:


30

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

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

Exemplo:

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

Alternativa: usando o awk

Da mesma forma, se usarmos o awk, não será necessário 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 indica ao awk para usar espaços, aspas simples ou vírgulas ou qualquer combinação dos mesmos como separadores de campo.

  • /version:/{print $2}

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


2
A -Eopção obviamente significa usar a sintaxe ERE, mas meu manual GNU sed 4.2.2 menciona apenas -r. -Efunciona, embora!
precisa saber é o seguinte

2
@ Law29 Sim. Para todo o GNU sed razoavelmente moderno, no entanto, -Eé um sinônimo não documentado para -r. O boato é que o POSIX decidiu -E, que o BSD / OSX já usa, e, se isso for adicionado ao padrão final, todos nós iremos fazer a transição para -E.
precisa saber é o seguinte

6

O sedcomando substitute ( s) espera um padrão de pesquisa e uma sequência de substituição. Você forneceu apenas 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 cutcom 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.

Eu também acrescentou -Fque grepdesde a cadeia que procurar é uma string fixa , não uma expressão regular.


1

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}'

o que provavelmente é mais fácil.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.