如何从Bash中的string中删除回车

我有以下variables。

echo "|$COMMAND|" 

哪个返回

 | REBOOT| 

我怎样才能删除第一个回车?

 echo "|$COMMAND|"|tr '\n' ' ' 

将用空格replace换行符(在POSIX / Unix中它不是回车符)。

说实话,我会考虑从bash转向更理智的东西。 或者首先避免生成这种格式不正确的数据。

嗯,这似乎也可能是一个可怕的安全漏洞,这取决于数据来自何处。

在bash之下,有一些bashisms:

tr命令可以replace为// bashism

 COMMAND=$'\nREBOOT\r \n' echo "|${COMMAND}|" | OOT | echo "|${COMMAND//[$'\t\r\n']}|" |REBOOT | echo "|${COMMAND//[$'\t\r\n ']}|" |REBOOT| 

请参见bash的手册页中的参数扩展

 man -Pless\ +/\/pattern bash 

进一步…

正如@AlexJordan所问,这将抑制所有指定的字符。 那么如果$COMMAND包含空格呢?

 COMMAND=$' \n RE BOOT \r \n' echo "|$COMMAND|" | BOOT | CLEANED=${COMMAND//[$'\t\r\n']} echo "|$CLEANED|" | RE BOOT | CLEANED=${CLEANED%%*( )} echo "|$CLEANED|" | RE BOOT| CLEANED=${CLEANED##*( )} echo "|$CLEANED|" |RE BOOT| 

不久:

 COMMAND=$' \n RE BOOT \r \n' CLEANED=${COMMAND//[$'\t\r\n']} && CLEANED=${CLEANED%%*( )} echo "|${CLEANED##*( )}|" |RE BOOT| 

注意:您可能必须使用shopt -s extglob才能使用*(...)语法。

请参见bash的手册页中的参数扩展

 man -Pless\ +/Parameter.Expansion bash 

通过删除所有回车清理您的variables:

 COMMAND=$(echo $COMMAND|tr -d '\n') 

使用bash

 echo "|${COMMAND/$'\n'}|" 

(请注意,这个问题中的控制字符是'换行'( \n ),而不是回车符( \r );后者将在一行中输出REBOOT| )。

说明

使用Bash Shell参数扩展 ${parameter/pattern/string}

模式被扩展为产生一个模式,就像在文件名扩展。 参数被扩展, 模式与其值最长的匹配被replace为string 。 […]如果string为空,则删除模式的匹配,并且可以省略/跟随模式

也使用$'' ANSI-C引用结构来指定换行符为$'\n' 。 直接使用换行符也可以,虽然不太漂亮:

 echo "|${COMMAND/ }|" 

完整的例子

 #!/bin/bash COMMAND="$'\n'REBOOT" echo "|${COMMAND/$'\n'}|" # Outputs |REBOOT| 

或者,使用换行符:

 #!/bin/bash COMMAND=" REBOOT" echo "|${COMMAND/ }|" # Outputs |REBOOT| 

如果您在启用了extglob选项的情况下使用bash,则可以通过以下方法删除仅尾部的空格:

 shopt -s extglob COMMAND=$'\nRE BOOT\r \n' echo "|${COMMAND%%*([$'\t\r\n '])}|" 

这输出:

 | RE BOOT| 

或者用##代替%%来replace前面的空格。

对我有效的是echo $testVar | tr "\n" " " echo $testVar | tr "\n" " "

testVar包含我的variables/脚本输出