Comment faire pour que sed omettre les lignes qui ne correspondent pas?


8

Dans l'exemple suivant, fait sedcorrespondre les lignes commençant par un aou un cet imprime le premier caractère de cette ligne ( aou 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

Cependant, les lignes qui ne correspondent pas au motif sont également imprimées. Comment puis-je dire sedd'omettre les lignes qui ne correspondent pas au modèle? Je peux obtenir l'effet souhaité en le combinant avec grep(comme suit) mais je voudrais savoir si je sedpeux y parvenir "par lui-même".

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

output:
a
c

Peu importe ce que vous vouliez vraiment savoir, mais votre modèle devrait commencer par ^ donc il est ancré au début de la ligne. Tel que codé, il correspondrait à un a ou à un c n'importe où dans la ligne tant qu'il ne s'agit pas du dernier caractère.
Joe

Réponses:


12

Utilisez le no-printflag ( -n) et imprimez explicitement les commandes de substitution réussies ( s///p):

 sed -n 's/\(a\|c\)./\1/p'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.