2012-05-25 8 views
13

Ich habe eine Liste von WörternWie fügt man einer Zeile mit SED oder AWK doppelte Anführungszeichen hinzu?

name,id,3 

Ich brauche es so doppelt haben zitiert

"name,id,3" 

ich versucht habe, sed 's /.*/ \ "& \"/g', bekam

"name,id,3 

Nur ein doppeltes Anführungszeichen

ich auch awk habe versucht, {Print "\" "$ 1" \ ""}, mit genau demselben Ergebnis

+1

Ihr sed Befehl funktioniert auf meinem Computer. Sie können den umgekehrten Schrägstrich vor den doppelten Anführungszeichen weglassen, da sie in einer einzelnen Zeichenfolge in Anführungszeichen unbrauchbar sind. – Scharron

+0

hmmm, ja, das ist komisch. Ich bekomme trotzdem ein Doppelzitat. Meine ursprüngliche Datei ist file.csv - hat eine lange Liste von "name, id, [[: num:]]". Warum funktioniert es nicht? – minerals

+1

Das 'g' ist nicht notwendig, verursacht aber kein Problem. Was ist deine Plattform? –

Antwort

8

Ihre Eingabedatei am Ende der Linien Zeilenumbrüche hat. Sie müssen dos2unix für die Datei verwenden, um sie zu entfernen. Oder Sie können dies tun:

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

, die den Wagenrücklauf entfernen und die Anführungszeichen hinzufügen.

+0

das hat geklappt! du hast recht, die datei kommt aus windows und wurde in windows generiert – minerals

+0

tolle lösung! Kannst du sagen etwas Licht auf was \ r und "\ 1" macht hier? –

+0

@satch_boogie: '\ r' ist ein Wagenrücklauf. '\ 1' ist der Inhalt der durch die Klammern vorgenommenen Aufnahme (also in diesem Fall die gesamte Zeile vor dem Wagenrücklauf). Das Ergebnis ist, dass der Wagenrücklauf entfernt und Angebote hinzugefügt werden. Ich denke, das "g" (global) am Ende ist unnötig, aber meine Antwort hat es vor der Frage des OP bewahrt. Weitere Informationen zum Erfassen von Gruppen finden Sie unter [this] (http://www.regular-expressions.info/brackets.html). –

11

Verwenden Sie diese an Rohr Ihre Eingabe in Brauchen Sie Hilfe:

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

^ ist der Anker für Zeilenanfang und $ der Anker für das Zeilenende. Mit der sed Zeile ersetzen wir den Zeilenanfang und das Zeilenende mit " bzw. ".

Beispiel:

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

ohne sed:

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

Ihre Datei scheint DOS-Zeilenenden zu haben. Pipe es durch dos2unixzuerst.

Beweis:

$ 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

Ich mag dich Variante, aber das gibt mir nur "Name, ID, 3 ohne zweites Doppelzitat Versucht sed 's/$ /" /', der Ausgang ist der gleiche!"Name, ID, 3 Es ist etwas falsch mit dieser Datei – minerals

+0

@ user1413424: Wie genau rufen Sie das auf? Mit dem genauen Befehl wird ** ** funktionieren. Die Frage ist, welche Shell Sie verwenden und wie Sie sind Es kann dazu führen, dass einige der Sonderzeichen (wie "$") verschluckt werden. – 0xC0000022L

+0

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

7

Sie awk statt sed wie diese verwenden:

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

oder sogar besser ist BASH printf wie folgt zu verwenden:

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

Kreative Verwendung von 'printf'. +1! – 0xC0000022L

+0

danke, sieht gut aus – minerals

+0

Ich habe Befehl als dies, aber ich brauche jede Ausgangslinie in "" eingeschlossen werden. Wie ändere ich diesen Befehl? : awk '{für (i = 2; i <= NF; i ++) {printf ("% s", $ i); } printf ("\ n")} 'all.txt> result.txt – user3823859

3

einfachste Weg, die ich gefunden habe ist die HEX zu verwenden Codes für doppelte Anführungszeichen:

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