Як зробити так, щоб sed не опустився?


8

У наступному прикладі sedзбігаються рядки, що починаються з a aабо a, cі друкується перший символ цього рядка ( aабо 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

Однак лінії, що не відповідають шаблону, також роздруковуються. Як я можу sedопустити рядки, які не відповідають шаблону? Я можу отримати бажаний ефект, комбінуючи його grep(далі), але хотілося б знати, чи sedможна досягти цього "сам собою".

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

output:
a
c

Не має значення для того, що ви насправді хотіли знати, але ваш шаблон повинен починатися з ^, тому він прив’язаний до початку рядка. Як закодовано, воно відповідатиме a або c в будь-якій точці, доки це не останній символ.
Джо

Відповіді:


12

Використовуйте no-printпрапор ( -n) і явно друкуйте успішні команди-замінники ( s///p):

 sed -n 's/\(a\|c\)./\1/p'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.