Estaba tratando de hacer coincidir / generar todo el texto antes de que apareciera el primer ] :
sed -i -r 's/^([^\]]*).*/\1/' "$FILE.tmp"Que sorprendentemente no funciona.
Sin embargo, buscar el otro paréntesis funciona:
sed -i -r 's/^([^\[]*).*/\1/' "$FILE.tmp"¿Es esto un error de sed o lo estoy haciendo mal?
Sé que puedo solucionar esto usando .*? lo cual es lo suficientemente bueno, pero este problema me tuvo perplejo durante tanto tiempo que me gustaría saber si hay algo que me perdí.
(Según --version, estoy usando GNU sed 4.2.2.)
No necesita citar el paréntesis de cierre ] . De hecho, su expresión regular se analiza como [^\] seguido de un error ] .
Desea utilizar la siguiente expresión regular (tenga en cuenta la falta de comillas con \ ):
sed -i -r 's/^([^]].*).*/\1/' "$FILE.tmp" La segunda expresión regular funciona por casualidad porque [ no tiene un significado especial en una expresión [] pero encontrará que también coincide con líneas que comienzan con \ .
De hecho, cuando se usa ] en un grupo [] , debe ser el primer carácter, o el segundo si el primero es un ^ .
Debería ser:
sed -r 's/^([^]]+).*/\1/' Tenga en cuenta que no necesita citar el ] si aparece en un grupo de caracteres.