Wie kann man dafür sorgen, dass nicht passende Linien weggelassen werden?

8

Stimmt im folgenden Beispiel sedmit Zeilen überein, die mit einem aoder a beginnen, cund gibt das erste Zeichen dieser Zeile ( aoder c) aus:

$ 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

Die Linien, die nicht zum Muster passen, werden jedoch auch ausgedruckt. Wie kann ich seddie Linien weglassen, die nicht zum Muster passen? Ich kann den gewünschten Effekt erzielen, indem grepich ihn mit (wie folgt) kombiniere, aber ich würde gerne wissen, ob seddies "von selbst" erreicht werden kann.

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

output:
a
c
freitass
quelle
Es spielt keine Rolle, was Sie wirklich wissen wollten, aber Ihr Muster sollte mit ^ beginnen, damit es am Anfang der Zeile verankert ist. Wie codiert, würde es irgendwo in der Zeile mit einem a oder c übereinstimmen, solange es nicht das letzte Zeichen ist.
Joe

Antworten:

12

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

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