Как заставить sed опускать не совпадающие строки?


8

В следующем примере sedсопоставляет строки, начинающиеся с 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

То, что вы действительно хотели знать, не имеет значения, но ваш паттерн должен начинаться с ^, поэтому он привязан к началу строки. Как закодировано, это будет соответствовать a или c в любом месте строки, если это не последний символ.
Джо

Ответы:


12

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

 sed -n 's/\(a\|c\)./\1/p'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.