Якщо будь-який рядок, що знаходиться безпосередньо після матчу, буде видалений, то Вашій sed
програмі доведеться розглянути послідовні збіги. Іншими словами, якщо ви видалите рядок після збігу, який також збігається, то, ймовірно, слід також видалити рядок, що слідує за цим.
Він реалізований досить просто - але вам доведеться трохи оглянути.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Він працює, міняючи місцями утримування та шаблони для кожного зчитуваних рядків - тому останній рядок можна порівнювати з поточним кожен раз. Отже, коли sed
читає рядок, він обмінюється вмістом своїх буферів - і попередній рядок - це вміст його буфера редагування, тоді як поточний рядок розміщується у просторі утримування.
Таким чином sed
перевіряє попередню лінію на матч з match
, і якщо його !
не знайшли два вирази в {
функції }
виконуються. sed
буде g
пов тримати простір перезапису шаблон простору - що означає , що поточна рядок , то в обох трюмних і структурі простору - і тоді вона буде //
перевірити його на матч з його недавно складеним регулярним виразом - match
- і якщо це НЕ match
він є p
rinted.
Це означає, що рядок друкується лише в тому випадку, якщо цього немає, а попередній рядок - ні . Він також передбачає будь-які непотрібні заміни для послідовностей es.match
match
match
Якщо ви хочете, щоб версія, яка могла випустити довільну кількість рядків, що виникають після match
неї, знадобиться трохи більше роботи:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... замініть 5 кількістю рядків (включаючи відповідні рядки), які ви хочете видалити ...
1
2
3
4
12
13
14
21