Regexes sed correspondem à correspondência mais longa. Sed não tem equivalente de não ganancioso.
Obviamente, o que queremos fazer é combinar
AB
,
seguido por
- qualquer quantia que não seja
AC
,
seguida por
AC
Infelizmente, sed
não é possível fazer o número 2 - pelo menos não para uma expressão regular com vários caracteres. Obviamente, para uma expressão regular de um caractere, como @
(ou mesmo [123]
), podemos fazer [^@]*
or [^123]*
. E assim podemos contornar as limitações do sed, alterando todas as ocorrências AC
para @
e, em seguida, à procura de
AB
,
seguido por
- qualquer número que não seja
@
,
seguido de
@
como isso:
sed 's/AC/@/g; s/AB[^@]*@/XXX/; s/@/AC/g'
A última parte altera instâncias sem correspondência de @
volta para AC
.
Mas, é claro, essa é uma abordagem imprudente, porque a entrada já pode conter @
caracteres; assim, combinando-os, podemos obter falsos positivos. No entanto, como nenhuma variável do shell terá um caractere NUL ( \x00
), é provável que o NUL seja um bom caractere a ser usado na solução alternativa acima, em vez de @
:
$ echo 'ssABteAstACABnnACss' | sed 's/AC/\x00/g; s/AB[^\x00]*\x00/XXX/; s/\x00/AC/g'
ssXXXABnnACss
O uso de NUL requer GNU sed. (Para garantir que os recursos GNU estejam ativados, o usuário não deve ter definido a variável de shell POSIXLY_CORRECT.)
Se você estiver usando sed com o -z
sinalizador do GNU para lidar com entradas separadas por NUL, como a saída de find ... -print0
, então NUL não estará no espaço do padrão e NUL é uma boa opção para a substituição aqui.
Embora o NUL não possa estar em uma variável do bash, é possível incluí-lo em um printf
comando. Se sua string de entrada pode conter qualquer caractere, incluindo NUL, consulte a resposta de Stéphane Chazelas, que adiciona um método de escape inteligente.