2012-05-25 188 views
13

que tienen una lista de palabras¿Cómo agregar comillas dobles a una línea con SED o AWK?

name,id,3 

necesito tenerlo entre comillas dobles como esto

"name,id,3" 

He tratado sed 's /.*/ \ "& \"/g', consiguió

"name,id,3 

Sólo una cotización doble

también he intentado awk {Print "\" "$ 1" \ ""}, con el mismo resultado exactamente Necesita ayuda

+1

Su comando sed funciona en mi computadora. Puede omitir la barra invertida antes de las comillas dobles ya que son inútiles en una sola cadena entre comillas. – Scharron

+0

hmmm, sí, esto es extraño. Recibo una comilla doble de todos modos. Mi archivo original es file.csv - tiene una larga lista de "nombre, id, [[: num:]]". ¿Por qué no funciona? – minerals

+1

La 'g' no es necesaria, pero no está causando su problema. ¿Cuál es tu plataforma? –

Respuesta

8

el archivo de entrada tiene retornos de carro al final de las líneas. Debe usar dos2unix en el archivo para eliminarlos. O puede hacer esto:

sed 's/\(.*\)\r/"\1"/g' 

que eliminará el retorno de carro y agregará las comillas.

+0

que funcionó! Tiene razón, el archivo proviene de Windows y se generó en Windows – minerals

+0

¡gran solución! ¿Puedes poner algo de luz sobre qué \ y "\ 1" está haciendo aquí? –

+0

@satch_boogie: '\ r' es un retorno de carro. '\ 1' es el contenido de la captura realizada por los paréntesis (por lo tanto, en este caso, toda la línea antes del retorno del carro). El resultado es que se elimina el retorno de carro y se agregan citas. Creo que el 'g' (global) al final es innecesario, pero mi respuesta lo conservó de la pregunta del OP. Consulte [this] (http://www.regular-expressions.info/brackets.html) para obtener más información sobre la captura de grupos. –

11

Utilice esta a la tubería de su entrada en:

sed 's/^/"/;s/$/"/' 

^ es el ancla para el inicio de línea y $ el ancla para el final de línea. Con la línea sed estamos reemplazando el inicio de línea y el final de línea con " y " respectivamente.

Ejemplo:

$ echo -e "name,id,2\nname,id,3\nname,id,4"|sed 's/^/"/;s/$/"/' 
"name,id,2" 
"name,id,3" 
"name,id,4" 

sin la sed:

$ echo -e "name,id,2\nname,id,3\nname,id,4" 
name,id,2 
name,id,3 
name,id,4 

El archivo parece tener los finales de línea de DOS. Tápelo dos2unixprimero.

Prueba:

$ cat test.txt 
name,id,2 
name,id,3 
name,id,4 
$ sed 's/^/"/;s/$/"/' test.txt 
"name,id,2 
"name,id,3 
"name,id,4 
$ cat test.txt|dos2unix|sed 's/^/"/;s/$/"/' 
"name,id,2" 
"name,id,3" 
"name,id,4" 
+0

Me gustas tu variante, pero eso me da solo "nombre, id, 3 sin segunda comilla doble ¡Has probado sed/$ /"/', la salida es la misma!"name, id, 3 Hay algo mal con este archivo – minerals

+0

@ user1413424: ¿cómo está invocando exactamente esto? Con el comando exacto de arriba ** funcionará **. La pregunta es qué shell está usando y cómo está invocando esto, porque algunos de los caracteres especiales (como '$') pueden ser tragados. – 0xC0000022L

+0

~/shared $ sed 's/^/"/; s/$ /" /' file.csv – minerals

7

Puede usar awk en lugar de sed como esto:

line='name,id,3' 
echo $line | awk '{printf("\"%s\"\n", $0);}' 

O aún mejor es usar printf BASH como esto:

printf '"%s"\n' $line 
+2

Uso creativo de 'printf'. +1! – 0xC0000022L

+0

gracias, se ve bien – minerals

+0

Tengo un comando como este, pero necesito que cada línea de salida se incluya dentro de "". Cómo modificar este comando? : awk '{for (i = 2; i <= NF; i ++) {printf ("% s", $ i); } printf ("\ n")} 'all.txt> result.txt – user3823859

3

forma más sencilla que he encontrado es utilizar el HEX códigos para comillas dobles:

echo name,id,3 | awk '{print "\x22" $1 "\x22"}' 
"name,id,3" 
Cuestiones relacionadas