当我输入以下内容时
echo "This is for testing" | tr -s [:space:]
我明白了...
This is for testing
我希望删除多个空格,让单词之间只留一个空格。我不知道我做错了什么。
答案1
在 中tr -s [:space:]
,未加引号的部分[:space:]
将被 shell 视为一个 glob,如果您有一个与该 glob 匹配的文件(文件名中包含:
、a
、c
、e
、p
、中的任意一个字符s
),那么您的 shell(可能是 bash)会将该 glob 扩展为该文件名:
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
(它还可能根据 shell 选项执行其他操作。)
因此,使用引号以便 shell 不会解释[: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:]