
wenn ich folgendes eingebe
echo "This is for testing" | tr -s [:space:]
Ich verstehe das ...
This is for testing
Ich wollte die vielen Leerzeichen entfernen und nur ein Leerzeichen zwischen den Wörtern einfügen. Ich weiß nicht, was ich falsch mache.
Antwort1
In wird tr -s [:space:]
das nicht angeführte Element von der Shell als Glob behandelt, und wenn Sie eine Datei haben, die mit diesem Glob übereinstimmt (ein Dateiname mit einem einzelnen Zeichen von , , , , , ), dann wird Ihre Shell (wahrscheinlich Bash) diesen Glob zu diesem Dateinamen erweitern:[:space:]
:
a
c
e
p
s
bash-5.1$ echo tr -s [:space:]
tr -s [:space:]
bash-5.1$ touch c
bash-5.1$ echo tr -s [:space:]
tr -s c
(Je nach Shell-Optionen kann es auch andere Dinge tun.)
Verwenden Sie also Anführungszeichen, damit die Shell Folgendes nicht interpretiert [:space:]
:
echo "This is for testing" | tr -s '[:space:]'
Antwort2
Bei mir funktioniert es, die Leerzeichen zu verkleinern, aber vielleicht funktioniert es bei Ihnen nicht, weil die Leerzeichen in Ihrem Beispieltext keine echten Leerzeichen sind.
Es könnten Tabs sein
Versuche dies
echo "This is for testing" | tr \\t " "
oder, wenn mehrere Registerkarten vorhanden sind, können Sie versuchen,
echo "This is for testing" | tr \\t " " | tr -s [:space:]