Как использовать «сед» с трубопроводом


34

Я хочу заменить строку, выведенную из grep, у меня есть:

$ npm info webpack | grep version 

это выводит меня

$ version: '2.1.0-beta.12',

но я хочу иметь:

$ 2.1.0-beta.12

Так что я думаю, что могу добиться этого, используя sedи заменяя ненужные подстроки. Но здесь идет самая сложная часть для меня:

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

Как можно достичь моей цели?

Ответы:


30

Если вы собираетесь использовать sed, нет необходимости также использовать grep. Пытаться:

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

Пример:

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

Альтернатива: использование awk

Точно так же, если мы используем awk, нет необходимости также grep:

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

Пример:

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

Как это работает:

  • -F"[ ',]+"

    Это говорит awk использовать пробелы, одинарные кавычки или запятые или любую их комбинацию в качестве разделителей полей.

  • /version:/{print $2}

    Если строка содержит version:, то выведите второе поле.


2
Эта -Eопция, очевидно, означает использование синтаксиса ERE, но в моем руководстве по GNU sed 4.2.2 только упоминается -r. -Eработает, хотя!
Закон 29

2
@ Law29 Да. Однако для всех достаточно современных GNU sed -Eэто недокументированный синоним -r. Ходят слухи, что POSIX установил -E, что BSD / OSX уже использует, и, если это будет добавлено к окончательному стандарту, мы все перейдем к -E.
John1024

6

Команда sedзамены ( s) ожидает шаблон поиска и строку замены. Вы предоставили только шаблон поиска. Вы также должны правильно заключать строки в кавычки:

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

Это даст вам результат '2.1.0-beta.12',, который не совсем то, что вы хотите.

Поскольку вывод из grepнастолько прост, вы можете использовать cutс разделителем, 'чтобы получить второе поле строки (без необходимости сложных регулярных выражений):

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

Это даст вам 2.1.0-beta.12.

Я также добавил -Fк grepтак струна поиска является фиксированной строкой , а не регулярное выражения.


1

Во-первых, вы можете попробовать использовать sed:

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

или вы можете использовать awk:

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

что, вероятно, проще.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.