Регекси седу відповідають найдовшій відповідності. Sed не має еквівалента не жадібного.
Очевидно, що ми хочемо зробити - це збіг
AB
,
за яким
- будь-яка кількість нічого, крім того
AC
,
за яким
AC
На жаль, sed
не можна зробити №2 - принаймні, не для регулярного виразу з кількома символами. Звичайно, для однозначного регулярного виразу, такого як @
(або навіть [123]
), ми можемо зробити [^@]*
або [^123]*
. І тому ми можемо обійти обмеження СЄПН шляхом змін всіх входжень AC
в , @
а потім в пошуках
AB
,
за яким
- будь-яка кількість нічого, крім
@
,
за яким
@
подобається це:
sed 's/AC/@/g; s/AB[^@]*@/XXX/; s/@/AC/g'
Остання частина змінює неперевершені екземпляри @
назад AC
.
Але, звичайно, це необережний підхід, тому що вхідні дані вже можуть містити @
символи, тому, зіставляючи їх, ми могли отримати помилкові позитиви. Однак, оскільки жодна змінна оболонки ніколи не матиме \x00
символу NUL ( ), NUL, ймовірно, є хорошим символом, який буде використаний у вищезгаданій обробці замість @
:
$ echo 'ssABteAstACABnnACss' | sed 's/AC/\x00/g; s/AB[^\x00]*\x00/XXX/; s/\x00/AC/g'
ssXXXABnnACss
Для використання NUL потрібен GNU sed. (Щоб переконатися, що функції GNU включені, користувач не повинен встановлювати змінну оболонки POSIXLY_CORRECT.)
Якщо ви використовуєте sed з -z
прапором GNU для обробки вхідного сигналу, розділеного NUL, наприклад, вихідного сигналу find ... -print0
, то NUL не буде в просторі шаблонів, і NUL є хорошим вибором для заміни тут.
Хоча NUL не може бути в bash змінній, можливо включити його в printf
команду. Якщо вхідний рядок може містити будь-який символ, включаючи NUL, то дивіться відповідь Стефана Шазеласа, який додає розумний метод виходу.