Como substituir um "no awk?

2

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.

    
por Michael Durrant 12.09.2015 / 16:16

4 respostas

3
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 12.09.2015 / 16:23
0

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:

  1. Em vez de passar seu programa para 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.
  2. 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.

por 12.09.2015 / 19:16
0
echo 'a string with a " at some point' | awk -v dq=\" '{sub(dq,"quote")}1'
    
por 13.09.2015 / 03:01
0

Você pode usar o escape octal:

awk 'sub("", "quote")' <<'eof'
a string with a " at some point
eof
    
por 15.01.2017 / 08:16