Wie kann ich mit Escape-Leerzeichen ein Echo durchführen?

Wie kann ich mit Escape-Leerzeichen ein Echo durchführen?

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 cdarin. 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 $aer 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 $alautet: 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

verwandte Informationen