23

Я хочу заменить строку, выведенную из 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

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

3 ответа3

18

Если вы собираетесь использовать 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: выведите второе поле.

5

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .