¿Cómo hacer que sed omita las líneas que no coinciden?

8

En el siguiente ejemplo, sedcoincide con las líneas que comienzan con una ao a ce imprime el primer carácter de esa línea ( ao 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

Sin embargo, las líneas que no coinciden con el patrón también se imprimen. ¿Cómo le digo sedque omita las líneas que no coinciden con el patrón? Puedo obtener el efecto deseado combinándolo con grep(como sigue), pero me gustaría saber si sedpuedo lograrlo "por sí mismo".

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

output:
a
c
freitass
fuente
No importa lo que realmente quisieras saber, pero tu patrón debe comenzar con ^, por lo que está anclado al comienzo de la línea. Según lo codificado, coincidiría con un a o c en cualquier parte de la línea siempre que no sea el último carácter.
Joe

Respuestas:

12

Use la no-printbandera ( -n) e imprima explícitamente los comandos sustitutos exitosos ( s///p):

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