No, las expresiones regulares sed no tienen coincidencias no codiciosas.
Puede hacer coincidir todo el texto hasta la primera aparición AC
utilizando "cualquier cosa que no contenga AC
" seguido de AC
, que hace lo mismo que Perl .*?AC
. La cuestión es que "cualquier cosa que no contenga AC
" no se puede expresar fácilmente como una expresión regular: siempre hay una expresión regular que reconoce la negación de una expresión regular, pero la expresión regular de la negación se complica rápidamente. Y en sed portátil, esto no es posible en absoluto, porque la negación regex requiere agrupar una alternancia que está presente en expresiones regulares extendidas (por ejemplo, en awk) pero no en expresiones regulares básicas portátiles. Algunas versiones de sed, como GNU sed, tienen extensiones de BRE que permiten expresar todas las expresiones regulares posibles.
sed 's/AB\([^A]*\|A[^C]\)*A*AC/XXX/'
Debido a la dificultad de negar una expresión regular, esto no se generaliza bien. Lo que puede hacer en su lugar es transformar la línea temporalmente. En algunas implementaciones de sed, puede usar nuevas líneas como marcador, ya que no pueden aparecer en una línea de entrada (y si necesita varios marcadores, use nueva línea seguida de un carácter variable).
sed -e 's/AC/\
&/g' -e 's/AB[^\
]*\nAC/XXX/' -e 's/\n//g'
Sin embargo, tenga en cuenta que la barra diagonal inversa no funciona en un juego de caracteres con algunas versiones sed. En particular, esto no funciona en GNU sed, que es la implementación de sed en Linux no incrustado; en GNU sed puedes usar \n
en su lugar:
sed -e 's/AC/\
&/g' -e 's/AB[^\n]*\nAC/XXX/' -e 's/\n//g'
En este caso específico, es suficiente reemplazar el primero AC
por una nueva línea. El enfoque que presenté anteriormente es más general.
Un enfoque más poderoso en sed es guardar la línea en el espacio de espera, eliminar todo excepto la primera parte "interesante" de la línea, intercambiar el espacio de espera y el espacio de patrón o agregar el espacio de patrón al espacio de espera y repetir. Sin embargo, si comienza a hacer cosas que son tan complicadas, realmente debería pensar en cambiar a awk. Awk tampoco tiene una coincidencia no codiciosa, pero puede dividir una cadena y guardar las partes en variables.