Что эквивалент “grep | сокращение”, использующее sed или awk?

Я не думаю, что существует terminfo возможность этого. На практике, тестируя значение TERM должно быть достаточно хорошим. Это - то, что я выполняю в моем .bashrc и .zshrc, и я не вспоминаю это являющийся проблемой.

case $TERM in
  (|color(|?))(([Ekx]|dt|(ai|n)x)term|rxvt|screen*)*)
    PS1=$'\e\]0;$GENERATED_WINDOW_TITLE\a'"$PS1"
esac
6
04.05.2015, 19:36
5 ответов

Как насчет использования awk?

awk -F = '/email2/ { print $2}' /etc/emails.conf
  • -F = поля разделены '='

  • '/ email2 / {print $ 2}' на строках, которые соответствует «Email2», распечатайте второе поле

4
27.01.2020, 20:24
perl -nlE 's/email2\s*=\s*// and say'    file

Где:

  • Perl -NL - это для каждой строки ...
  • S / Email2 = // Удаляет идентификатор поиска электронной почты И если бы вы могли это сделать ...
  • Скажите Печатает текущую входную входную линию
  • \ S * Ноль или больше пробелов (эквивалент [\ \ n] *)
3
27.01.2020, 20:24

Точное , эквивалентное , эквивалентное было бы чем-то вроде:

sed -n '/email2/{s/^[^=]*=\([^=]*\).*/\1/;p;}' < file

, но вы, вероятно, захотите вместо этого:

sed -n 's/^[^=]*email2[^=]*=[[:blank:]]*//p' < file

(это совпадение Email2 Со стороны перед первым = и верните все справа от первого = (пропуская ведущие пробелы), не только часть до второго = Если есть).

4
27.01.2020, 20:24

Нет необходимости устанавливать для разделителя полей какое-либо специальное значение, такое как "=". По умолчанию AWK использует непрерывные пробелы и табуляции в качестве разделителей полей, которые пропускаются, поэтому интерпретирует каждую строку вашего файла как имеющего три поля, без начального пробела в третьем поле

awk '/^email2/ { print $3 }'

производит

user@winkum.worg

Вышеупомянутое также будет соответствовать любым строкам, начинающимся с email2 , например email20 , точное совпадение, которое вы можете использовать

awk '$1 == "email2" { print $3 }'
0
27.01.2020, 20:24

Чтобы получить что-то вроде grep | cut, вы можете использовать sed -n s/A/B/p.

По умолчанию sedпечатает каждую строку после обработки всех команд. Вы можете отключить весь вывод, который вы явно не печатаете из команды, с помощью sed -n.

Команда sпринимает форму s/$FIND/$REPLACE/$FLAGS. В частности, флаг pпечатает строку всякий раз, когда производится замена.

В сочетании с ними вы можете легко совмещать и резать:

sed -nE "s/email2 = (.+)/\1/p" < /etc/emails.conf

На самом деле, это более мощное средство, чем grep | cut, потому что вы можете использовать произвольный шаблон замены.

(Параметр -Eвключает современное регулярное выражение, которое позволяет ссылаться на группы захвата в шаблоне замены. Для простого кроя вы можете обойтись без него, используя более умные узоры.)

0
27.01.2020, 20:24

Теги

Похожие вопросы