如何从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/脚本输出