Wie man "sed" mit Rohrleitungen benutzt

34

Ich möchte eine Zeichenfolge ersetzen, die von ausgegeben grepwurde. Ich habe:

$ npm info webpack | grep version 

es gibt mich aus

$ version: '2.1.0-beta.12',

aber ich möchte haben:

$ 2.1.0-beta.12

Also denke ich, ich könnte das erreichen, indem ich sedunnötige Teilstrings benutze und ersetze. Aber hier ist der schwierige Teil für mich:

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

Wie kann ich mein Ziel erreichen?

Oskar Szura
quelle

Antworten:

30

Wenn Sie sed verwenden möchten, müssen Sie nicht auch grep verwenden. Versuchen:

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

Beispiel:

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

Alternative: mit awk

Wenn wir awk verwenden, besteht ebenfalls keine Notwendigkeit, auch grep:

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

Beispiel:

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

Wie es funktioniert:

  • -F"[ ',]+"

    Dies weist awk an, Leerzeichen, einfache Anführungszeichen oder Kommas oder eine beliebige Kombination davon als Feldtrennzeichen zu verwenden.

  • /version:/{print $2}

    Wenn eine Zeile enthält version:, drucken Sie das zweite Feld.

John1024
quelle
2
Die -EOption bedeutet natürlich, die ERE-Syntax zu verwenden, aber mein GNU sed 4.2.2-Handbuch erwähnt nur -r. -Efunktioniert aber!
Law29
2
@ Law29 Ja. Für alle einigermaßen modernen GNU ist sed jedoch -Eein undokumentiertes Synonym für -r. Es geht das Gerücht, dass sich POSIX für -Edas BSD / OSX-System entschieden hat. Wenn dies zum endgültigen Standard hinzugefügt wird, werden wir alle darauf umsteigen -E.
John1024
6

Der sedErsatzbefehl ( s) erwartet ein Suchmuster und eine Ersatzzeichenfolge. Sie haben nur ein Suchmuster angegeben. Sie sollten auch Zeichenfolgen in der Shell richtig zitieren:

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

Dies gibt Ihnen das Ergebnis '2.1.0-beta.12',, das nicht ganz das ist, was Sie wollen.

Da die Ausgabe von grepso einfach ist, können Sie verwendencut mit dem Begrenzer 'das zweite Feld der Zeile abrufen (ohne komplizierte reguläre Ausdrücke zu benötigen):

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

Dies wird dir geben 2.1.0-beta.12.

Ich habe auch hinzugefügt -F, grepda die Zeichenfolge, nach der Sie suchen, eine feste Zeichenfolge und kein regulärer Ausdruck ist.

Kusalananda
quelle
1

Zunächst können Sie versuchen, Folgendes zu verwenden sed:

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

oder Sie können verwenden awk:

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

das ist wohl einfacher.

MariusMatutiae
quelle