A regex estendida do Unix é compatível?

1

A regex da ferramenta do Unix é totalmente compatível?

Por exemplo, se eu grep -oE "\$text *\( *([^)]) *\)" , tenho a garantia de substituir a parte exata que obtive se usar sed -E "s/\$text *\( *([^)]) *\)/replacement/g" ? E isso se estende a todo o regex?

Até que ponto isso combina (ou não)?

Em uma nota lateral, meu homem sed não mostra a opção -E - mas ainda funciona, e me diz que a chave de regex é -r . -E e -r são a mesma coisa?

    
por Pierre Antoine Guillaume 23.02.2018 / 15:06

1 resposta

2

Os manuais do GNU grep e GNU sed mencionam -E como a opção para usar expressões regulares estendidas:

grep :

-E --extended-regexp
Interpret the pattern as an extended regular expression (ERE). (-E is specified by POSIX.)

sed :

-E -r --regexp-extended
Use extended regular expressions rather than basic regular expressions.

(Há também uma menção de -E sendo suportado, mas não documentado anteriormente.)

Você pode verificar as definições exatas dos regexes suportados por ambos, mas sua regex parece padrão o suficiente. Na verdade, ele parece equivalente à regex básica\$text *( *[^)] *) (a menos que sua substituição sed use o grupo de captura).

No entanto, observe que, conforme escrito (entre aspas duplas), não corresponderá a nada. A barra invertida irá escapar do sinal de dólar para o shell, impedindo que ele seja tratado como expansão de parâmetro. Mas grep ou sed verá uma regex começando com $ para o final da linha. Não pode haver nada após o final da linha, portanto, o padrão não pode corresponder. Você precisa adicionar mais duas barras invertidas ou usar aspas simples em vez de aspas duplas.

    
por 23.02.2018 / 15:36