Die Frage bezieht sich explizit auf sed und ist eine sehr gültige Frage zur sed-Regexp-Syntax.
Für den Fall, dass es bei der zugrunde liegenden Frage darum geht, Leerzeichen durch _wirklich zu ersetzen , finden Sie hier eine alternative Antwort, bei der das "richtige Werkzeug für den Job" zum Übersetzen von Zeichen verwendet wird tr. ( man tr).
Der Befehl tr abc 123ersetzt die Zeichen der ersten Liste durch die entsprechenden Zeichen in der zweiten. Somit tr ' ' _ersetzt Raum durch Strich.
$ echo ' 1 2 3 ' | tr ' ' _
_1_2_____3__
Um den allgemeineren Fall zu zeigen, einschließlich verschiedener Arten von Leerzeichen wie in Ihrem Beispiel, ist
hier die Ausgabe, um nur das normale Leerzeichen ' 'zum Vergleich zu übersetzen:
echo ' 1 2 3 x\ny\tz' | tr ' ' _
_1_2_____3__x
y z
Und hier ist die Ausgabe bei der Übersetzung aller Zeichen der Klasse: space: to _:
echo ' 1 2 3 x\ny\tz' | tr '[:space:]' _
_1_2_____3__x_y_z_
(Beachten Sie, dass am Ende der Ausgabe kein Zeilenumbruch steht - und _nach dem z.).
Dies kann explizit als tr ' \t\n' _die Kurzform von geschrieben werden tr ' \t\n' ___.
$ echo ' 1 2 3 x\ny\tz' | tr ' \t\n' _
_1_2_____3__x_y_z_