Як користуватися "sed" з трубопроводами


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, немає необхідності також грепнути:

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 СЕД 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.