awk print apóstrofo / aspas simples

Não consigo descobrir como escapar de tudo ao usar o awk.

Preciso incluir cada entrada string com aspas simples, por exemplo,

input string1 string2 string3 output "string1" "string2" "string3" 

Tenho lutado com o escape " " $0 e tudo o mais e simplesmente não consigo fazer funciona. Ou $ 0 é passado diretamente para o bash ou algo mais acontece.

Comentários

Resposta

Aqui estão algumas maneiras:

  1. use sequências de escape octal. Em sistemas baseados em ASCII, onde " é codificado como byte 39 (octal 047), isso seria:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. passar a citação como uma variável

     $ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3" 

Comentários

  • "\047" nunca passou pela minha cabeça. Uau. Obrigado.
  • O r salve seu script awk em um arquivo script.awk para executar como awk -f script.awk input e então você pode apenas fazer { print "'" $0 "'" } ou { printf "'%s'\n", $0 }. A incapacidade de usar ' s em um script ' -delimitado é um problema de shell, não um problema de awk.
  • Qualquer octal escapado de man ascii é bom no awk. Mesmo \000 para NUL (em GNU / awk, mas não mawk) e \042 para " .
  • Eu recomendo adicionar # 3: escape da citação no nível do shell: awk '{ print "'\''" $0 "'\''" }' input e # 4 use aspas duplas no nível do shell: awk "{print \"'\" \$0 \"'\" }" input. Visto que esta é a resposta aceita e já está listando vários métodos, ela também pode incluir essas alternativas.

Resposta

No código awk, basta colocar o apóstrofo entre aspas duplas. Você pode concatenar strings colocando-as próximas umas das outras (justaposição), não importa como essas strings são construídas (literal, variável, referência de campo, expressão entre parênteses, …).

 { print """ $0 """ }  

Se este código awk estiver incluído em um script de shell e o código awk estiver em um literal entre aspas simples, você deve organizar para passar o caractere de aspas simples para awk. Use aspas simples-backslash-single-aspa-single-aspas "\"" para incluir um caractere de aspas simples em um literal de shell com aspas simples.

 awk "{ print ""\""" $0 ""\""" }"  

Alternativamente, expresse o código awk sem usar um caractere de aspas simples. Você pode usar uma barra invertida seguida por três dígitos octais para representar qualquer caractere em um literal de string no awk. Para uma aspa simples em sistemas baseados em ASCII, isso “s \047.

 awk "{ print "\047" $0 "\047" }"  

Comentários

  • awk '{ print "'\''" $0 "'\''" }' isso é uma loucura.
  • @ ArtemS.Tashkinov É ' também a solução superior quando se trata de portabilidade, e eu diria que é mais compreensível para alguém que conhece o shell tão bem quanto deveria, se eles ' estão usando shell do que escapes octais. '\'' é algo que qualquer pessoa que faz script de shell deve internalizar como forma de escapar de aspas simples em um string de shell entre aspas simples, especialmente porque strings entre aspas simples são a robusta / portátil / maneira mais segura de escapar de strings arbitrárias em todos os shells tipo Bourne. Mas, como alternativa, você pode colocar o código awk em uma string entre aspas duplas: awk "{print \"'\" \$0 \"'\" }"

Resposta

Observe que t você não precisa do awk para isso.

Você pode usar o paste utilitário básico em vez disso:

 < input paste -d """ /dev/null - /dev/null 

Seria mais eficiente e teria menos limitações do que awk -baseado ou sed.

Resposta

O código awk só precisa ser

{ print """ $0 """ } 

Você pode colocar isso em um arquivo, então não precisa citar nada:

$ printf "a\nb\n" | awk -f quote.awk "a" "b" 

Ou use uma string entre aspas duplas e escape das aspas e do cifrão:

$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }" 

Ou em Bash / ksh / zsh, use o $"..." forma de aspas, que permitem escapar da aspa simples dentro de:

$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }" 

Resposta

você pode usar o comando sed também.

<infile sed -E "s/^|$/"/g" 

ou

<infile sed -E "s/.*/"&"/" 

Comentários

  • Ou sed -E "s/.*/'&'/" infile.
  • @chepner sim, mudei para a resposta:)

Resposta

Um maneira de enrugar a string entre aspas simples é por meio do comando printf gnu xargs:

< file xargs -d"\n" printf ""%s"\n" 

Perl

perl -sple "$_="$q$_$q"" -- -q=\" file 

Usando GNU sed:

sed -e "G;H;z;x;y/\n/"/" file 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *