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
- Domanda simile su Super User .
Risposta
Ecco un paio di modi:
-
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"
-
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 comeawk -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