Come fare a sed omettere le linee non corrispondenti?


8

Nel seguente esempio, trova sedle righe che iniziano con una ao una ce stampa il primo carattere di quella riga ( 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

Tuttavia, vengono stampate anche le linee che non corrispondono al motivo. Come faccio a dire seddi omettere le linee che non corrispondono al modello? Posso ottenere l'effetto desiderato combinandolo con grep(come segue) ma vorrei sapere se sedriesco a ottenere questo "da solo".

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

output:
a
c

Non importa per quello che volevi veramente sapere, ma il tuo modello dovrebbe iniziare con ^ quindi è ancorato all'inizio della linea. Come codificato, corrisponderebbe a a o c in qualsiasi punto della linea purché non sia l'ultimo carattere.
Joe

Risposte:


12

Usa il no-printflag ( -n) e stampa esplicitamente i comandi sostitutivi riusciti ( s///p):

 sed -n 's/\(a\|c\)./\1/p'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.