Wie kann man sed dazu bringen, nicht übereinstimmende Zeilen auszulassen?

Wie kann man sed dazu bringen, nicht übereinstimmende Zeilen auszulassen?

Im folgenden Beispiel sedwerden Zeilen verglichen, die mit einem aoder einem beginnen c, und das erste Zeichen dieser Zeile ( aoder c) wird ausgegeben:

$ 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

Allerdings werden auch die Zeilen ausgedruckt, die nicht dem Muster entsprechen. Wie erkläre ich, dass seddie Zeilen, die nicht dem Muster entsprechen, weggelassen werden sollen? Ich kann den gewünschten Effekt erzielen, indem ich es mit grep(wie folgt) kombiniere, aber ich würde gerne wissen, ob seddas „allein“ erreicht werden kann.

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

output:
a
c

Antwort1

Verwenden Sie das no-printFlag ( -n) und drucken Sie erfolgreiche Ersetzungsbefehle explizit aus ( s///p):

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

verwandte Informationen