Linux 当我尝试用空格替换新行、制表符和连续空格时,字符“a”将被删除

Linux 当我尝试用空格替换新行、制表符和连续空格时,字符“a”将被删除,linux,bash,unix,sh,tr,Linux,Bash,Unix,Sh,Tr,下面是我正在键入的命令 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”正在从文件中删除,这是不应该发生的 有人能帮忙吗。 Thank[:space:]是一个有效的全局模式,与单个的、s、p、a、c或e匹配,并且您的工作目录中似乎

下面是我正在键入的命令

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”正在从文件中删除,这是不应该发生的

有人能帮忙吗。 Thank

[:space:]是一个有效的全局模式,与单个的、s、p、a、c或e匹配,并且您的工作目录中似乎有一个名为a的文件,该模式与之匹配,因此在shell执行路径名扩展后,您实际上运行的是tr-s a''。引用该图案以防止外壳对其进行检查

... | tr -s '[:space:]' ' ' >  unreadable.c
请注意,如果没有匹配的文件,默认行为是按字面处理模式,并且您的命令将按预期工作。但是,有一个shell选项可以设置为将不匹配的模式视为错误,因此最好总是引用一个参数,以确保将其逐字传递给命令

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


您可以这样使用sed:

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