Varios idiomas escapan a las comillas poniendo dos de ellos en una fila, tal vez intente eso.
Joshuahealy
Intenté awk 'BEGIN {FS = "";} {printf "' '% s' '", $ 1}', pero no se imprimió una sola comilla.
Esta página dice que es imposible incluir una comilla simple en una cadena entre comillas simples. Quizás tenga que convertir a comillas dobles.
Joshuahealy
2
Es imposible, pero dos cadenas de shell adyacentes entre comillas simples se pegan juntas en un parámetro. Y dos cadenas de shell entre comillas simples pegadas por caracteres que no son espacios en blanco también se pegan en un gran globo: 'abc'd'ef'es abcdef: literal más dmás literal. El destá fuera de las comillas, y se puede reemplazar ese dcon \'hacer 'abc'\''ef'que será evaluado abc'ef.
Kaz
Respuestas:
160
Quizás esto es lo que estás buscando:
awk 'BEGIN {FS=" ";} {printf "'\''%s'\'' ", $1}'
Es decir, con '\''usted cierra la apertura ', luego imprime un literal 'escapándose de él y finalmente abre de 'nuevo.
No tiene nada que ver con awk. El 'personaje cierra el 'literal de cadena de shell de apertura . El literal de shell no admite un escape de barra invertida para esto. La secuencia '\''hace el truco: cierra el literal de comillas simples, especifica el carácter de comillas (usando un escape que se admite fuera de los literales de comillas simples) y luego vuelve a abrir un nuevo literal de comillas simples. Puede pensar en ello como una secuencia de escape de cuatro caracteres para obtener una sola cita. :)
Kaz
2
@Steve: Muchas gracias por tu útil respuesta. ¡Me ahorraste muchos dolores de cabeza!
John Slegers
4
@syntaxerror Las citas que usa para preparar argumentos para invocar awkson simplemente una cuestión del intérprete de comandos que está usando para componer líneas de comando. El '{printf $2}'se convierte en algún argumento para una execvellamada al sistema o similar, donde simplemente se ve como una cadena C terminada en nulo sin comillas simples. Awk nunca ve las comillas y tampoco sed. Usted puede, de hecho, el uso de comillas dobles, pero comillas dobles no impedir la expansión de la concha de $2, por lo que tiene que escapar el signo de dólar con una barra invertida para que sea literal: "{printf \$2}".
Kaz
4
@syntaxerror Por costumbre, un script awk en línea generalmente se escapa con comillas simples, porque la sintaxis awk a menudo contiene elementos léxicos que son especiales para el shell, como literales de cadena entre comillas dobles y campos numerados indicados por signos de dólar. Si una expresión regular sed (o lo que sea) contiene sintaxis de shell, también debe tener cuidado. sed -e "s/$FOO/$BAR/"no funcionará si la intención es reemplazar el texto literal $FOOcon $BAR. La forma más sencilla sería sed -e 's/$FOO/$BAR/.
Kaz
1
@syntaxerror Si encierra programas awk entre comillas dobles, se encontrará con muchos escapes, como awk "{ print \"abc\", \$1 }". Cada vez que aparece una comilla doble en el programa awk, debe escaparse para que no cierre la cita de shell. Y compare esto: awk '{print "\\"}'(imprima una barra invertida) versus lo que se necesita con comillas dobles:, awk "BEGIN {print \"\\\\\" }"¡Uf! Ambas comillas tienen que escaparse y ambas barras invertidas. Los convertidos de concha \\ a \ lo que necesitamos \\\\ para codificar \\ .
Siempre que recuerde que \047es la secuencia de escape octal para el carácter de comillas simples, creo que esta alternativa es la más legible.
Anthony Geoghegan
4
Para scripts pequeños, una forma opcional de hacerlo legible es usar una variable como esta:
awk -v fmt="'%s'\n"'{printf fmt, $1}'
Lo encontré conveniente en un caso en el que tuve que producir muchas veces el carácter de comillas simples en la salida y el \ 047 lo hacía totalmente ilegible
'abc'd'ef'
esabcdef
: literal másd
más literal. Eld
está fuera de las comillas, y se puede reemplazar esed
con\'
hacer'abc'\''ef'
que será evaluadoabc'ef
.Respuestas:
Quizás esto es lo que estás buscando:
Es decir, con
'\''
usted cierra la apertura'
, luego imprime un literal'
escapándose de él y finalmente abre de'
nuevo.fuente
'
personaje cierra el'
literal de cadena de shell de apertura . El literal de shell no admite un escape de barra invertida para esto. La secuencia'\''
hace el truco: cierra el literal de comillas simples, especifica el carácter de comillas (usando un escape que se admite fuera de los literales de comillas simples) y luego vuelve a abrir un nuevo literal de comillas simples. Puede pensar en ello como una secuencia de escape de cuatro caracteres para obtener una sola cita. :)awk
son simplemente una cuestión del intérprete de comandos que está usando para componer líneas de comando. El'{printf $2}'
se convierte en algún argumento para unaexecve
llamada al sistema o similar, donde simplemente se ve como una cadena C terminada en nulo sin comillas simples. Awk nunca ve las comillas y tampoco sed. Usted puede, de hecho, el uso de comillas dobles, pero comillas dobles no impedir la expansión de la concha de$2
, por lo que tiene que escapar el signo de dólar con una barra invertida para que sea literal:"{printf \$2}"
.sed -e "s/$FOO/$BAR/"
no funcionará si la intención es reemplazar el texto literal$FOO
con$BAR
. La forma más sencilla seríased -e 's/$FOO/$BAR/
.awk "{ print \"abc\", \$1 }"
. Cada vez que aparece una comilla doble en el programa awk, debe escaparse para que no cierre la cita de shell. Y compare esto:awk '{print "\\"}'
(imprima una barra invertida) versus lo que se necesita con comillas dobles:,awk "BEGIN {print \"\\\\\" }"
¡Uf! Ambas comillas tienen que escaparse y ambas barras invertidas. Los convertidos de concha\\
a\
lo que necesitamos\\\\
para codificar\\
.Una cita simple se representa mediante
\x27
Como en
Fuente
fuente
\x27
es una extensión; POSIX Awk solo reconoce\047
. (también\47
está bien si no va seguido de un dígito octal.)\047
), no hex (\x27
), códigos de escape; consulte awk.freeshell.org/PrintASingleQuote .Otra opción es pasar la comilla simple como una variable awk :
Ejemplo más simple con concatenación de cadenas:
fuente
fuente
\047
es la secuencia de escape octal para el carácter de comillas simples, creo que esta alternativa es la más legible.Para scripts pequeños, una forma opcional de hacerlo legible es usar una variable como esta:
Lo encontré conveniente en un caso en el que tuve que producir muchas veces el carácter de comillas simples en la salida y el \ 047 lo hacía totalmente ilegible
fuente