Por padrão, sed
usa Publicações regulares básicas POSIX , que não incluem o operador de alternância |
. Muitas versões do sed
, incluindo o GNU e o FreeBSD, suportam a comutação para Expressões regulares estendidas , que incluem |
alternação. Como você faz isso varia: O GNU sed usa -r
, enquanto FreeBSD , NetBSD , OpenBSD e OS X sed use -E
. Outras versões geralmente não suportam nada. Você pode usar:
echo 'cat dog pear banana cat dog' | sed -E -e 's/cat|dog/Bear/g'
e ele funcionará nesses sistemas BSD e sed -r
com o GNU.
O GNU sed
parece ter suporte totalmente não documentado, mas funcional para -E
, portanto, se você tiver um script multiplataforma que esteja confinado ao acima, essa é sua melhor opção. Como não está documentado, você provavelmente não pode confiar nele.
Um comentário observa que as versões BSD suportam -r
como um alias não documentado também. O OS X ainda não faz hoje e as máquinas mais antigas do NetBSD e do OpenBSD que eu tenho acesso também não, mas o NetBSD 6.1 funciona. Os Unices comerciais que eu posso alcançar universalmente não. Então, com tudo isso, a questão da portabilidade está ficando bastante complicada neste momento, mas a resposta simples é mudar para awk
se você precisar, que usa EREs em todos os lugares.