Em awk
, o primeiro argumento para as funções sub()
e gsub()
, o segundo argumento para a match()
função e o terceiro argumento opcional para split()
, é uma expressão regular estendida.
Esse argumento pode ser uma expressão arbitrária avaliada como uma string interpretada como uma expressão regular ou pode ser uma constante de expressão regular.
Em awk
, uma constante de expressão regular é escrita /RE/
para alguma expressão regular RE
(um " ERE
token" na awk
gramática).
Pergunta: Supondo que RE
permaneça o mesmo (alguma expressão regular não variável), há alguma diferença prática entre using /RE/
e using "RE"
(um " STRING
token" na awk
gramática) em uma chamada para, por exemplo, sub()
? Como alternativa: Existe alguma awk
implementação conhecida que faça diferença entre essas duas formas de representar uma expressão regular em uma chamada para as funções mencionadas acima?
O motivo da pergunta é que me lembro de ter que modificar algum awk
código que tentei usar "RE"
como expressão regular em uma chamada para sub()
ou gsub()
, porque, por qualquer motivo, a awk
implementação em questão fez a coisa errada, a menos que eu chamasse a função com /RE/
.
Infelizmente, isso foi há algum tempo (mais de 2 anos), então não me lembro dos detalhes e não tenho certeza de qual Unix eu usava na época (possivelmente OpenBSD), mas desde então venho querendo fazer a pergunta.
Sim, eles são diferentes em todas as implementações do awk na forma como as barras invertidas são usadas como escapes. Veja https://www.gnu.org/software/gawk/manual/gawk.html#Computed-Regexps para este e mais detalhes:
Portanto, ao escrever um regexp, o único momento a considerar o uso
"RE"
em vez de/RE/
é quando:/
s e nenhum escape para que você possa escrever, por exemplo,sub("/foo/bar","")
em vez desub(/\/foo\/bar/,"")
apenas para concisão, ouvar=17; sub("stuff" var,"")
caso contrário, sempre use delimitadores de regexp (
/
) em torno de regexps, não delimitadores de string ("
).