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