
Ich möchte eine Variable mit Leerzeichen in eine Textdatei ausgeben.
a=a\ b\ c
echo $a > /tmp/a
Das obige Ergebnis ist eine Datei mit a b c
darin. Was ist, wenn ich die Datei lesen muss a\ b\ c
?
Ich habe es versucht printf %q $a
, aber das scheint auch nicht das zu bewirken, was ich möchte.
Hinweis: Gehen Sie auch davon aus, dass ich den Inhalt nicht erstelle, wenn $a
er mir außerhalb meiner Kontrolle übergeben wird. Ich muss nur sicherstellen, dass er mit Escape-Leerzeichen gespeichert wird.
Antwort1
Backslashs maskieren das nächste Zeichen. In Ihrem Fall haben Sie das Leerzeichen maskiert, und der Inhalt von $a
lautet: a b c
. Wenn Sie möchten, dass der Inhalt von $a Backslashs enthält, müssen Sie diese maskieren:
a=a\\\ b\\\ c
oder
a='a\ b\ c'
Wenn $a bereits Text mit Leerzeichen enthält und Sie ihn in einer Datei speichern möchten, gehen Sie einfach wie folgt vor:
printf "%q" "$a" > /tmp/a
Als Sie ausgeführt haben:
printf "%q" $a > /tmp/a
Sie haben printf angewiesen, zu zitieren3aufgeteilte und zusammengefasste Textteile: a
, b
, und c
, die es pflichtbewusst maskierte (ohne etwas zu tun), bevor es als nach /tmp/a umgeleitet wurde abc
.
Lesen Sie sich das Ganze gründlich durch:Warum gerät mein Shell-Skript ins Stocken, wenn es sich um Leerzeichen oder andere Sonderzeichen handelt?um zu sehen, was los ist.
Antwort2
Setzen Sie es einfach in Anführungszeichen.
a="a\ b\ c"
Alternativ können Sie der Flucht entkommen.
a=a\\\ b\\\ c
Beides endet mit dem gleichen Ergebnis.
Antwort3
Lösung basierend auf dem Feedback von Jeff:
echo $a | sed -e "s/ /\\\ /g" > /tmp/a