Jak sprawić, by sed pomijał niepasujące linie?


8

W poniższym przykładzie seddopasowuje linie rozpoczynające się od a alub a ci wypisuje pierwszy znak tej linii ( alub 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

Jednak linie, które nie pasują do wzoru, są również drukowane. Jak powiedzieć, sedaby pominąć linie, które nie pasują do wzorca? Mogę uzyskać pożądany efekt, łącząc go z grep(jak poniżej), ale chciałbym wiedzieć, czy sedmogę to osiągnąć „sam”.

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

output:
a
c

Nie ma znaczenia, co naprawdę chciałeś wiedzieć, ale twój wzór powinien zaczynać się od ^, więc jest zakotwiczony na początku linii. Po zakodowaniu pasowałby do a lub c w dowolnym miejscu linii, o ile nie jest to ostatni znak.
Joe

Odpowiedzi:


12

Użyj no-printflag ( -n) i jawnie wypisz udane polecenia zastępcze ( s///p):

 sed -n 's/\(a\|c\)./\1/p'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.