почему я не могу удалить пробелы с помощью tr -s

почему я не могу удалить пробелы с помощью tr -s

когда я ввожу следующее

echo "This   is   for    testing" | tr -s [:space:]

Я понял...

This   is   for    testing

Я надеялся убрать несколько пробелов и оставить только один пробел между словами. Я не вижу, что я делаю неправильно.

решение1

В tr -s [:space:], то, что не заключено в кавычки, [:space:]будет рассматриваться оболочкой как глоб, и если у вас есть файл, который соответствует этому глоб (имя файла с одним символом из :, a, c, e, p, s), то ваша оболочка (вероятно, bash) расширит этот глоб до этого имени файла:

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

(Он также может выполнять другие действия в зависимости от параметров оболочки.)

Поэтому используйте кавычки, чтобы оболочка не интерпретировала [:space:]:

echo "This   is   for    testing" | tr -s '[:space:]'

решение2

Мне это помогает сжимать пробелы, но, возможно, вам это не подходит, потому что пробелы в вашем тексте-образце на самом деле не пробелы.

Это могут быть вкладки

Попробуй это

echo "This   is   for   testing" | tr \\t " "

или, если вкладок несколько, вы можете попробовать использовать

echo "This  is   for   testing" | tr \\t " " | tr -s [:space:]

Связанный контент