Unix awk para substituir aspas simples internas por ponto de interrogação invertido

1

Eu quero substituir a aspa simples interna (ignorando a aspa simples externa) por um ponto de interrogação invertido (¿). Estou usando o comando awk abaixo, mas não está funcionando. O ponto e vírgula é o caractere separador.

awk -F "'" -v OFS="'" '{for  (i=2; i<=NF; i+=2) gsub("'","27", $i } 1' filename

E os dados são:

'gasg'dhsh';'dhdjs'
    
por Rahul Jain 29.06.2018 / 09:22

2 respostas

1

Para substituir todas as aspas simples que são flanqueadas por palavras com ¿ em um arquivo (supondo que bash seja usado, para que possamos usar $'...' ):

q=$'27'
sed "s/\>'\</$q/g" file

Alternativamente

q=$( printf '27' )
sed "s/\>'\</$q/g" file

ou

sed "s/\>'\</¿/g" file

Com a entrada dada, isso produziria

'gasg¿dhsh';'dhdjs'

O padrão \>'\< corresponderia a qualquer ' que tenha um caractere de palavra imediatamente antes e depois. O caractere ; e o início / fim da linha não são caracteres de palavras, enquanto g e d são.

Seu código tem três problemas principais:

  1. Uma única string citada no shell talvez nunca contenha uma aspa simples. A aspa simples incorporada na chamada para gsub() terminará a única string entre aspas que é o código awk , produzindo um erro de sintaxe.

  2. Definir o separador de campos de entrada como uma aspa simples usando -F "'" fará com que awk divida a entrada em todas as aspas simples. Isso significa que o programa awk nunca verá aspas simples, e seu gsub() nunca substituirá nada.

  3. A string 27 não é um ponto de interrogação invertido, a menos que seja interpretada como uma sequência de escape.

Corrigir todos esses problemas faria o programa funcionar, mas substituiria todas as ocorrências de aspas simples:

$ awk -F ';' -v OFS=';' '{ for (i=1; i<=NF; ++i) gsub("'"'"'", sprintf("27"), $i); print }' file
¿gasg¿dhsh¿;¿dhdjs¿
    
por 29.06.2018 / 11:01
0

Assumindo que por "aspas simples internas" você insinua que existem "aspas simples externas" e também assumindo que os qoutes externos estão no início e no final de cada campo (delimitado por ";" neste caso) você pode usar :

$ awk -F ';' '{OFS=FS;for(j=1;j<=NF;j++){gsub(q,i,$j);sub("^"i,q,$j);sub(i"$",q,$j)}}{print}' q='7' i='¿'
'gasg¿dhsh';'dhdjs'
    
por 29.06.2018 / 13:49