echo 'duck " cat' | sed 's/"/quote/'
Ou em awk
, como sub
tem uma expressão regular, marque-a como tal com a forma usual //
:
echo 'duck " cat' | awk 'sub(/"/,"quote")'
Por exemplo, preciso alterar um "
para a palavra quote
em
para alterar
a string with a " at some point
em
a string with a quote at some point
Eu tentei:
$ echo 'a string with a " at some point' | awk 'sub(",quote)'
awk: cmd. line:1: sub(",quote)
awk: cmd. line:1: ^ unterminated string
awk: cmd. line:1: sub(",quote)
awk: cmd. line:1: ^ syntax error
$
$ echo 'a string with a " at some point' | awk 'sub(\",quote)'
awk: cmd. line:1: sub(\",quote)
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: sub(\",quote)
awk: cmd. line:1: ^ syntax error
enquanto
$ echo 'a string with a " at some point' |
awk 'sub("string","rope")'
=>
a rope with a " at some point
funciona para a palavra da corda de corda.
Se você quiser usar uma string, você deve citá-la. Isso se aplica a seqüências de caracteres que consistem em caracteres alfabéticos (como você mostra no seu exemplo string / string), mas também para sequências de metacaracteres, como as aspas duplas. Em outras palavras, sub (","quote")
não funciona pela mesma razão que sub (q,"quote")
não funciona.
Você precisa garantir que suas aspas duplas estejam dentro dos terminadores de string. Isso é um pouco mais difícil devido ao fato de que você já usou a aspa simples como o terminador de cadeia no shell para passar seu programa para awk
, tornando assim mais difícil usá-lo em seu programa. Existem duas maneiras de evitar esse problema:
awk
como uma string, grave-o em um arquivo (digamos que chamamos de substitution.awk
) e execute awk
com o parâmetro -f
para apontá-lo para o arquivo (isto é, awk -f substition.awk
). Isso libera as aspas simples como um terminador de string, para que você possa usá-lo em seu programa. O awk
e seu shell suportam a barra invertida ( \
) como um caractere de escape. Com ele, você diz ao shell ou awk
que ele não deve interpretar o próximo caractere da maneira usual, mas deve tratá-lo como um caractere normal. Em outras palavras, você pode fazer isso:
awk 'sub(\'"\',"quote")'
ou isto:
awk 'sub("\"","quote")'
No primeiro exemplo, você escapa duas citações simples do shell, de modo que awk
as veja; no segundo, você escapa de uma aspa dupla de awk
, para que você crie uma string com aspas duplas.
echo 'a string with a " at some point' | awk -v dq=\" '{sub(dq,"quote")}1'
Você pode usar o escape octal:
awk 'sub("", "quote")' <<'eof'
a string with a " at some point
eof
Tags awk escape-characters quoting