awk print apostrofo / virgolette singole

Non riesco a capire come sfuggire a tutto mentre uso awk.

Devo racchiudere ogni input stringa con virgolette singole, ad es.

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

Ho combattuto con lescape " " $0 e tutto il resto e non posso fare funziona. $ 0 viene passato direttamente a bash oppure succede qualcosaltro.

Commenti

Risposta

Ecco un paio di modi:

  1. usa sequenze di escape ottali. Su sistemi basati su ASCII dove " è codificato come byte 39 (047 ottale), questo sarebbe:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. passa la citazione come variabile

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

Commenti

  • "\047" non mi è mai passato per la mente. Wow. Grazie.
  • O r salva il tuo script awk in un file script.awk per eseguirlo come awk -f script.awk input e poi puoi semplicemente fare { print "'" $0 "'" } o { printf "'%s'\n", $0 }. Limpossibilità di utilizzare ' s in uno script ' -delimited è un problema di shell, non un problema di awk.
  • Qualsiasi ottale sfuggito da man ascii va bene in awk. Anche \000 per NUL (in GNU / awk ma non mawk) e \042 per " .
  • Consiglio di aggiungere # 3: evita le virgolette a livello di shell: awk '{ print "'\''" $0 "'\''" }' input e # 4 usa le virgolette doppie a livello di shell: awk "{print \"'\" \$0 \"'\" }" input. Poiché questa è la risposta accettata e elenca già più metodi, potrebbe anche includere tali alternative.

Risposta

In awk code, metti semplicemente lapostrofo tra virgolette doppie. Puoi concatenare le stringhe mettendole una accanto allaltra (giustapposizione), indipendentemente da come queste stringhe sono costruite (letterale, variabile, riferimento di campo, espressione tra parentesi, …).

 { print """ $0 """ }  

Se questo codice awk è incluso in uno script di shell e il codice awk è in un letterale tra virgolette singole, devi organizzare per passare il carattere di virgolette singole per awk. Utilizza virgolette singole-barra rovesciata-virgolette singole-virgolette singole "\"" per includere virgolette singole in un letterale shell con virgolette singole.

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

In alternativa, esprimi il codice awk senza usare un singolo carattere di virgoletta. Puoi usare una barra rovesciata seguita da tre cifre ottali per rappresentare qualsiasi carattere in una stringa letterale in awk. Per una singola citazione su sistemi basati su ASCII, “s \047.

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

Commenti

  • awk '{ print "'\''" $0 "'\''" }' è semplicemente folle.
  • @ ArtemS.Tashkinov ' è anche di gran lunga la soluzione migliore quando si tratta di portabilità, e direi che è più comprensibile per qualcuno che conosce la shell così come dovrebbe se essi ' stanno usando la shell piuttosto che gli escape ottali. '\'' è qualcosa che chiunque faccia script di shell dovrebbe interiorizzare come un modo per sfuggire alle virgolette singole in un stringa di shell con virgolette singole, soprattutto perché le stringhe con virgolette singole sono il modo robusto / portatile / più sicuro per sfuggire a stringhe arbitrarie in tutte le shell di tipo Bourne. Ma in alternativa potresti mettere il codice awk in una stringa con virgolette doppie: awk "{print \"'\" \$0 \"'\" }"

Risposta

Nota che Per questo non è necessario awk.

Puoi utilizzare lutilità di base paste:

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

Sarebbe più efficiente e avrebbe meno limitazioni rispetto a awk -based o sed -soluzioni basate.

Risposta

Il codice awk deve solo essere

{ print """ $0 """ } 

Potresti inserirlo in un file, quindi non è necessario citare nulla:

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

Oppure usa una stringa tra virgolette ed esci dalle virgolette e dal segno del dollaro:

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

Oppure in Bash / ksh / zsh, utilizza $"..." forma di virgolette, che ti permettono di sfuggire alla virgoletta singola allinterno:

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

Risposta

puoi utilizzare anche il comando sed.

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

o

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

Commenti

  • Oppure sed -E "s/.*/'&'/" infile.
  • @chepner sì, lho spostato nella risposta:)

Risposta

Uno modo per racchiudere la stringa tra virgolette singole è tramite il comando printf gnu xargs:

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

Perl

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

Utilizzo di GNU sed:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *