8

В следующем примере sed сопоставляет строки, начинающиеся с a или a c и печатает первый символ этой строки (a или c):

$ echo "ag
bh
ci
dj
ek
fl" | sed 's/\(a\|c\)./\1/' # Matches lines starting with 'a' or 'c'.

output:
a
bh
c
dj
ek
fl

Тем не менее, линии, которые не соответствуют шаблону, также распечатываются. Как мне сказать, чтобы sed пропустил строки, которые не соответствуют шаблону? Я могу получить желаемый эффект, комбинируя его с grep (как показано ниже), но я хотел бы знать, может ли sed добиться этого "сам по себе".

$ echo "ag
bh
ci
dj
ek
fl" | grep '[ac]' | sed 's/\(a\|c\)./\1/'

output:
a
c

1 ответ1

12

Используйте флаг no-print (-n) и явно выводите успешные команды замены (s///p):

 sed -n 's/\(a\|c\)./\1/p'

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