Регекси седу відповідають найдовшій відповідності. 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, то дивіться відповідь Стефана Шазеласа, який додає розумний метод виходу.