echo ' 1 2 3 '|sed 's/[[:space:]]*/_/g'
Ich möchte _1_2_____3__
als Ausgabe sehen. Stattdessen sehe ich _1_2_3_
als Ausgabe. Was mache ich falsch??
BEARBEITEN
Die andere Sache, die mich verwirrt und die ich im obigen Beispiel vergessen habe, ist, warum dies:
echo ' test1 test2 ' | sed 's/[[:space:]]*/_/g'
zeigt dies:
_t_e_s_t_1_t_e_s_t_2_
Wie kann [[:space:]]
zwischen t
und e
und s
... übereinstimmen ?
echo ' test1 test2 ' | sed 's/[[:space:]]\+/_/g'
's/[[:space:]]\{1,\}/_/g'
Portabilität verwenden.Antworten:
Weil Sie verwenden
*
, was bedeutet, dass es 0 oder mehr Leerzeichen entspricht. Null oder mehrere Leerzeichen werden also durch einen Unterstrich ersetzt_
.Versuchen:
Denken Sie daran, dass dies
[[:space:]]
auch mit Tabulator, Zeilenumbruch und Wagenrücklauf übereinstimmt.Hinweis
quelle
Sie haben bereits eine Antwort, aber ich möchte darauf hinweisen, dass es in einem so einfachen Szenario nicht nötig ist, sich etwas vorzustellen:
Wenn Sie nur Leerzeichen und Tabulatoren ersetzen möchten, können Sie auch das Konstrukt [\ t] verwenden:
quelle
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 wirdtr
. (man tr
).Der Befehl
tr abc 123
ersetzt die Zeichen der ersten Liste durch die entsprechenden Zeichen in der zweiten. Somittr ' ' _
ersetzt Raum durch Strich.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:Und hier ist die Ausgabe bei der Übersetzung aller Zeichen der Klasse: space: to
_
:(Beachten Sie, dass am Ende der Ausgabe kein Zeilenumbruch steht - und
_
nach demz
.).Dies kann explizit als
tr ' \t\n' _
die Kurzform von geschrieben werdentr ' \t\n' ___
.quelle
tr
. Ich werde das Beispiel, das ich ursprünglich gepostet habe, für immer bereuen. Ich habe mich speziell gefragt, wie ich eine Folge von Leerzeichen durch ein Zeichen ersetzen kann , obwohl ich das nur schlecht erklärt habe.sed
wie in den Antworten verwendet, sollte zumindest wissen, dass es dafür ein viel einfacheres Werkzeug gibt.