当我尝试用 space 替换新行、制表符和连续的 space 时,字符 'a' 被删除

caracter 'a' getting removed when I try to replace new line, tabs and consecutive spaces with a space

下面是我输入的命令

cat program.c | tr '\n' ' ' | tr '\t' ' ' | tr -s [:space:] ' ' >unreadable.c

输出为

Hi w ssup. How re you doing bro Its nice to see you g in bro .

但问题是字符 'a' 正在从文件中删除,这不应该发生。

任何人都可以帮忙。 谢谢

[:space:] 是一个有效的 glob 模式(匹配单个 'space),你的工作目录中似乎有一个名为 a 的文件,模式匹配,所以你 really 运行 tr -s a ' ' 而不是在 shell 执行路径名扩展之后。引用模式以防止 shell 扩展它。

... | tr -s '[:space:]' ' ' >  unreadable.c

(请注意,如果没有匹配的文件,默认行为是按字面意思处理模式,您的命令将按预期工作。但是,您可以设置一个 shell 选项来处理 non-matching 模式作为错误,因此最好总是引用一个参数以保证它被 字面意思 传递给命令。)


[:space:] 已经包含换行符和制表符,因此您只需要调用一次 tr:

tr '[:space:]' ' ' < program.c > unreadable.c

你可以像这样使用 sed:

cat program.c | sed -r "s/\n|\t|\s+/ /g" > unreadable.c