warum kann ich Leerzeichen nicht mit tr -s entfernen

warum kann ich Leerzeichen nicht mit tr -s entfernen

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:]:aceps

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:]

verwandte Informationen