Colocando a lacuna e todas as respostas juntas, e também observando a página man do grep ( man grep
), temos dois tipos principais de expressões regulares: Regex Básico e Regex Estendido.
De acordo com o homem grep:
Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, +, {, \|, (,and ).
Em outras palavras, você pode capturar grupos com um único grep usando escape ()
como grep \(....\)
ou se você usa grep -E
ou egrep
você não precisa escapar parênteses: egrep '(....)'
Mesmas regras se aplicam ao sed. Um simples sed entende expressões regulares básicas, portanto, é necessário escapar para capturar grupos: sed 's/\(....\)\(...\)//'
ou você pode ativar o suporte de regex estendido na opção sed
com -E
ou -r
(dependendo da implementação do sed): sed -E 's/(...)(...)//'
Como resultado, todos os comandos abaixo são válidos:
$ echo "INBOUND_PATH|/tmp" | grep '^\(INBOUND_PATH\)|\(.*\)$';echo $?
INBOUND_PATH|/tmp
0
$ echo "INBOUND_PATH|/tmp" | egrep '(INBOUND_PATH)\|(.*)$';echo $?
INBOUND_PATH|/tmp
0
$ echo "INBOUND_PATH|/tmp" | sed 's/^\(INBOUND_PATH\)|\(.*$\)//'
/tmp
$ echo "INBOUND_PATH|/tmp" | sed -E 's/(INBOUND_PATH)\|(.*)$//'
/tmp
Preste atenção ao manuseio de símbolos especiais em diferentes Regexes.
Por exemplo, veja o tratamento do símbolo pipe |
nos comandos acima:
Na regex básica (BRE):
Você não precisa escapar símbolo pipe para coincidir com um símbolo de pipe literal.
Escapando símbolo de tubo no BRE, será considerado como um operador OR (que acidentalmente funcionará no seu caso).
Similarilly, no BRE você não precisa escapar do parêntese ( )
para corresponder a um parêntese literal, mas você precisa escapar dos parênteses para capturar um grupo.
Em regex estendido (ERE):
Você precisa escapar do símbolo do pipe para ser correspondido literalmente, já que por padrão no símbolo ERE pipe é tratado como operador OR (manipulação oposta comparada ao BRE)
Similarilly em ERE você precisa escapar dos parênteses para combinar com um literall
parêntese (
, já que, por padrão, parênteses em ERE são usados para capturar grupos.