Jak używać „sed” z orurowaniem

34

Chcę zastąpić ciąg wyjściowy grep, mam:

$ npm info webpack | grep version 

wyprowadza mnie

$ version: '2.1.0-beta.12',

ale chcę mieć:

$ 2.1.0-beta.12

Myślę więc, że mógłbym to osiągnąć, używając sedi zastępując niepotrzebne podciągi. Ale tutaj jest dla mnie trudna część:

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

Jak mogę osiągnąć mój cel?

Oskar Szura
źródło

Odpowiedzi:

30

Jeśli zamierzasz używać sed, nie ma potrzeby używania grep. Próbować:

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

Przykład:

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

Alternatywnie: używając awk

Podobnie, jeśli użyjemy awk, nie ma potrzeby grep:

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

Przykład:

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

Jak to działa:

  • -F"[ ',]+"

    To mówi awk, aby używał spacji, pojedynczych cudzysłowów lub przecinków lub dowolnej ich kombinacji jako separatorów pól.

  • /version:/{print $2}

    Jeśli linia zawiera version:, wydrukuj drugie pole.

John1024
źródło
2
Ta -Eopcja oczywiście oznacza użycie składni ERE, ale moja instrukcja GNU sed 4.2.2 tylko wspomina -r. -Edziała jednak!
Prawo 29
2
@ Law29 Tak. Jednak dla wszystkich rozsądnie współczesnych GNU sed -Ejest nieudokumentowanym synonimem -r. Plotka głosi, że POSIX już się zdecydował -E, z którego już korzysta BSD / OSX, a jeśli zostanie to dodane do ostatecznego standardu, wszyscy przejdziemy na -E.
John1024,
6

Polecenie sedsubstitute ( s) oczekuje wzorca wyszukiwania i ciągu zastępującego. Dostarczyłeś tylko wzór wyszukiwania. Powinieneś również poprawnie cytować ciągi w powłoce:

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

To da ci wynik '2.1.0-beta.12',, który nie jest dokładnie tym, czego chcesz.

Ponieważ dane wyjściowe z grepsą tak proste, możesz użyć cutz separatorem, 'aby uzyskać drugie pole wiersza (bez potrzeby skomplikowanych wyrażeń regularnych):

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

To ci da 2.1.0-beta.12.

Dodałem też -Fdo grepponieważ ciąg szukasz jest ustalony ciąg , a nie wyrażenie regularne.

Kusalananda
źródło
1

Najpierw możesz spróbować użyć sed:

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

lub możesz użyć awk:

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

co jest prawdopodobnie łatwiejsze.

MariusMatutiae
źródło