No puedo averiguar cómo escapar de todo mientras uso awk.
Necesito incluir cada entrada cadena con comillas simples, por ejemplo,
input string1 string2 string3 output "string1" "string2" "string3"
He estado luchando con escapar de " " $0
y todo lo demás y simplemente no puedo hacer funciona. O se pasa $ 0 directamente a bash o sucede algo más.
Comentarios
- Pregunta similar sobre Superusuario .
Respuesta
Aquí hay un par de formas:
-
use secuencias de escape octales. En sistemas basados en ASCII donde
"
está codificado como byte 39 (octal 047), eso sería:awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3"
-
pasar la cita como una variable
$ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3"
Comentarios
-
"\047"
nunca se me ha pasado por la cabeza. Wow. Gracias. - O r guarde su script awk en un archivo
script.awk
para ejecutarlo comoawk -f script.awk input
y luego puede simplemente hacer{ print "'" $0 "'" }
o{ printf "'%s'\n", $0 }
. La imposibilidad de utilizar'
s en un script delimitado por'
es un problema de shell, no un problema de awk. - Cualquier octal escapado de man ascii es bueno en awk. Incluso
\000
para NUL (en GNU / awk pero no mawk) y\042
para"
. - Recomiendo agregar # 3: escape de la cita en el nivel de shell:
awk '{ print "'\''" $0 "'\''" }' input
y # 4 use comillas dobles en el nivel de shell:awk "{print \"'\" \$0 \"'\" }" input
. Dado que esta es la respuesta aceptada y ya incluye varios métodos, también podría incluir esas alternativas.
Respuesta
En código awk, simplemente ponga el apóstrofo entre comillas dobles. Puede concatenar cadenas colocándolas una al lado de la otra (yuxtaposición), sin importar cómo se construyan estas cadenas (literal, variable, referencia de campo, expresión entre paréntesis,…).
{ print """ $0 """ }
Si este código awk está incluido en un script de shell y el código awk está en un literal entre comillas simples, debe hacer arreglos para pasar el carácter de comilla simple para awk. Use comillas simples, barra inclinada invertida, comillas simples, comillas simples "\""
para incluir un carácter de comillas simples en un literal de shell entre comillas simples.
awk "{ print ""\""" $0 ""\""" }"
Alternativamente, exprese el código awk sin usar un carácter de comillas simples. Puede usar una barra invertida seguida de tres dígitos octales para representar cualquier carácter en una cadena literal en awk. Para una cita simple en sistemas basados en ASCII, eso «s \047
.
awk "{ print "\047" $0 "\047" }"
Comentarios
-
awk '{ print "'\''" $0 "'\''" }'
esto es una locura. - @ ArtemS.Tashkinov It ' también es, con mucho, la solución superior en lo que respecta a la portabilidad, y yo diría que es más comprensible para alguien que conoce el shell tan bien como debería si ellos ' están usando shell que los escapes octal.
'\''
es algo que cualquiera que haga scripts de shell debería internalizar como la forma de escapar de las comillas simples en un cadena de shell entre comillas simples, especialmente porque las cadenas entre comillas simples son la forma robusta / portátil / más segura de escapar de cadenas arbitrarias en todos los shells tipo Bourne. Pero, alternativamente, puede poner el código awk en una cadena entre comillas dobles:awk "{print \"'\" \$0 \"'\" }"
Responder
Tenga en cuenta que No necesitas awk
para eso.
Puedes usar la utilidad básica paste
en su lugar:
< input paste -d """ /dev/null - /dev/null
Sería más eficiente y tendría menos limitaciones que awk
o sed
soluciones basadas en.
Respuesta
El código awk solo necesita ser
{ print """ $0 """ }
Puede poner eso en un archivo, por lo que no necesita citar nada:
$ printf "a\nb\n" | awk -f quote.awk "a" "b"
O use una cadena entre comillas dobles y escape de las comillas y el signo de dólar:
$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }"
O en Bash / ksh / zsh, use el $"..."
forma de comillas, que le permiten escapar de la comilla simple dentro:
$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }"
Respuesta
también puede utilizar el comando sed
.
<infile sed -E "s/^|$/"/g"
o
<infile sed -E "s/.*/"&"/"
Comentarios
- O
sed -E "s/.*/'&'/" infile
. - @chepner sí, lo moví a answer:)
Answer
Uno La forma de incluir la cadena entre comillas simples es mediante el 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