Respuestas:
El "|" También necesita una barra invertida para obtener su significado especial.
echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
Hará lo que quieras.
Como sabes, si todo lo demás falla, lee el manual :-).
Manual del usuario de GNU sed , sección 3.3 Descripción general de la sintaxis de expresión regular :
`REGEXP1 \ | REGEXP2 '
Coincide ya sea REGEXP1 o REGEXP2.
Tenga en cuenta la barra invertida ...
Desafortunadamente, la sintaxis de expresiones regulares no está realmente estandarizada ... hay muchas variantes, que difieren entre otras cosas en las que los "caracteres especiales" necesitan \ y los que no. En algunos incluso es configurable o depende de interruptores (como en GNU grep
, que puede cambiar entre tres dialectos de expresiones regulares diferentes).
Esta respuesta en particular es para GNU sed . Hay otras sed
variantes, por ejemplo, la utilizada en los BSD, que se comportan de manera diferente.
sed
admite alternancia, pero solo con sintaxis de expresiones regulares "extendida" ( -E
), lo que significa que no hay barras invertidas ni en las tuberías ni en los paréntesis:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Dado que hay varios comentarios con respecto a sed
implementaciones que no son Gnu : al menos en OS X, puede usar el -E
argumento para sed
:
Interprete las expresiones regulares como expresiones regulares extendidas (modernas) en lugar de expresiones regulares básicas (BRE). La página del manual re_format (7) describe completamente ambos formatos.
Luego puede usar metacaracteres de expresión regular sin escapar de ellos. Ejemplo:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
GNU sed también admite la -r
opción (expresiones regulares extendidas). Esto significa que no tiene que escapar de los metacaracteres:
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
Salida:
hi hi
-r
opción es realmente muy útil para la legibilidad de las expresiones. Esa debería ser la respuesta aceptada.
El \|
no funciona con sed en Solaris 10 tampoco. Lo que hice fue usar
perl -p -e 's/bl(ia|f)//g'
Seguimiento: sed -E lo permite en MacOS. No necesita barra invertida para |.
sed -E 's/this|orthat/oooo/g' infile