Você pode ter pensado nisso.
Um pouco.
Eu tenho que trabalhar com FS=" \(|\), "
,
e até consegui encurtá-lo para FS=" \(|), "
.
- Você parecia acreditar que precisava fazer
%código%,
quando tudo que você precisava fazer era
"(regex1)|(regex2)"
. - Você parecia acreditar nisso cercando parênteses em parênteses de agrupamento, os parênteses internos se tornariam parênteses textuais e literais. Não funciona assim. O agrupamento de expressões regulares pode aninhar-se; para tratar parênteses como parênteses textuais literais, você precisa escapar deles.
-
"regex1|regex2"
é especial em uma expressão regular somente dentro de um grupo. Se o)
tiver escapado, o(
não precisa ser.
Aqui é onde fica complicado.
Ingenuamente, acima, )
deve ser bom o suficiente.
Mas o GAWK tem um problema com expressões regulares nas constantes de string;
é discutido em Guia do usuário do GNU Awk, Seção 9.1.3.1 .
Ele se concentra em obter um literal FS=" \(|), "
no texto de substituição
para uma chamada &
, sub()
ou gsub()
,
mas parece aplicar-se também a gensub()
:
… there are several levels of escape processing going on.
First, there is the lexical level, which is when
awk
reads your program and builds an internal copy of it to execute. Then there is the runtime level, which is whenawk
actually scans the [program and determines how to execute it].At both levels,
awk
looks for a defined set of characters that can come after a backslash. At the lexical level, it looks for the escape sequences listed in Escape Sequences. Thus, for every ‘\’ thatawk
processes at the runtime level, you must type two backslashes at the lexical level. …
Ênfase (última sentença) adicionada.
O que isso parece dizer é que, se quisermos definir FS
para FS
(para escapar do parêntese esquerdo,
para tratar os parênteses como um parêntese textual literal),
você precisa atribuir " \(|), "
ou especificar FS=" \(|), "
(para escapar das barras invertidas).
Você pode verificar isso com um teste simples:
Execute -F' \(|), '
e, em seguida, imprima awk -F' \(|), '
de dentro do seu programa.
Será exibido como FS
.
Em geral, se você quiser transformar um caractere especial
em um caractere não-especial (ou, ocasionalmente, vice-versa),
a abordagem comum e tradicional é escapar com um \(|),
(barra invertida).
Mas há outro mecanismo específico para expressões regulares:
use uma expressão \
.
Os únicos caracteres especiais em expressões […]
são […]
, ^
e -
(e isso depende da posição).
-
]
significa[pq]
oup
-
q
significa[()]
ou(
-
)
significa[(p]
ou(
-
p
significa[(]
ou ... bem, como não há outros caracteres, Significa apenas um literal(
.
Então, se você é alérgico a barras invertidas, pode definir (
.