Якщо будь-який рядок, що знаходиться безпосередньо після матчу, буде видалений, то Вашій 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він є printed.
Це означає, що рядок друкується лише в тому випадку, якщо цього немає, а попередній рядок - ні . Він також передбачає будь-які непотрібні заміни для послідовностей es.match matchmatch
Якщо ви хочете, щоб версія, яка могла випустити довільну кількість рядків, що виникають після 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