it-swarm.com.de

Wie man "sed" mit Rohrleitungen benutzt

Ich möchte einen String ersetzen, der von grep ausgegeben wurde. 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 mit sed erreichen und unnötige Teilzeichenfolgen ersetzen. 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?

26
Oskar Szura

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 version: enthält, drucken Sie das zweite Feld.

22
John1024

Der sed-Ersatzbefehl (s) erwartet ein Suchmuster und eine Ersatzzeichenfolge. Sie haben nur ein Suchmuster angegeben. Sie sollten auch Zeichenfolgen in der Shell korrekt zitieren:

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

Dadurch erhalten Sie das Ergebnis '2.1.0-beta.12',, das nicht ganz Ihren Wünschen entspricht.

Da die Ausgabe von grep so einfach ist, können Sie cut mit dem Trennzeichen ' verwenden, um das zweite Feld der Zeile abzurufen (ohne komplizierte reguläre Ausdrücke zu benötigen):

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

Dies gibt Ihnen 2.1.0-beta.12.

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

6
Kusalananda

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

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

oder Sie können awk verwenden:

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

das ist wohl einfacher.

1
MariusMatutiae