Портативний спосіб зробити це - і більш ефективний спосіб - з адресами. Ви можете зробити це:
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
Таким чином, якщо рядок не містить котячого рядка і не містить рядкових рядків собаки sed
b
, вибігають із сценарію, автоматично відбиває свій поточний рядок і перетягується в наступному, щоб розпочати наступний цикл. Тому він не виконує наступну інструкцію - яка в цьому прикладі c
вішає весь рядок для читання ведмедя, але він може зробити все, що завгодно.
Це, ймовірно , варто відзначити також , що будь-яка заява , слідуючи !b
в цій sed
команді може тільки відповідати по рядку , що містить або рядку dog
або cat
- так що ви можете виконувати подальші випробування без будь - якої небезпеки сполучати лінії , яка - це значить , тепер ви можете застосувати правила лише до того чи іншого.
Але це далі. Ось вихід із наведеної команди:
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Ви також можете портативно реалізувати таблицю пошуку із зворотними налаштуваннями.
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
Налаштування цього простого прикладу набагато більше, але це може зробити набагато більш гнучкими sed
сценарії з часом.
У першому рядку я x
змінюю простір утримування та простір візерунка, а потім вставляю собаку <space>
котячої кішки<space>
<space>
в простір перед тим, як x
змінити їх.
З цього G
моменту і в кожному наступному рядку я вміщую простір, доданий до простору шаблону, а потім перевіряю, чи всі символи від початку рядка до нового рядка, який я щойно додав у кінці, відповідають рядку, оточеному пробілами після нього. Якщо так, я замінюю весь лот на Bear, а якщо ні, то шкоди не завдано, тому що я наступним чином P
вказую лише до першого зустрічається нового рядка в просторі шаблону, тоді d
вибираю його все.
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
І коли я кажу гнучко, я маю на увазі це. Ось вона замінює кота на BrownBear та собаку на BlackBear :
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'
###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear
Звичайно, можна значно розширити вміст таблиці пошуку - я взяв цю ідею з електронних листів Грега Уббена на цю тему, коли в 90-х він описав, як він сконструював грубий калькулятор з одного sed s///
твердження.
-r
варіант як синонім-E
для сумісності з GNU СЕД. OpenBSD і OS Xsed -E
інтерпретуватимуть трубу, що втекла, як дослівну, а не як оператор чергування. Ось робоче посилання на сторінку чоловічої сторінки NetBSD, і ось для OpenBSD, якому не виповнилося десяти років.