我有以下变量。
echo "|$COMMAND|"
哪个返回
|
REBOOT|
如何删除第一条换行符?
\n
(十六进制0x0A)被称为lie feed(LF);它与字符回车符(CR)\r
(十六进制0x0D)不同,后者在Windows和许多网络协议中用作两字节行尾序列CR LF中的第一个字节。
我有以下变量。
echo "|$COMMAND|"
哪个返回
|
REBOOT|
如何删除第一条换行符?
\n
(十六进制0x0A)被称为lie feed(LF);它与字符回车符(CR)\r
(十六进制0x0D)不同,后者在Windows和许多网络协议中用作两字节行尾序列CR LF中的第一个字节。
Answers:
该tr
命令可以由//
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
man -Pless\ +/\\\'string\\\' bash
man -Pless\ +/^\\\ *Parameter\\\ Exp bash
man -Pless\ +/^\\\ *QUOTING bash
如@AlexJordan的要求,这将禁止显示所有指定的字符。那如果$COMMAND
包含空格怎么办...
COMMAND=$' \n RE BOOT \r \n'
echo "|$COMMAND|"
|
BOOT
|
CLEANED=${COMMAND//[$'\t\r\n']}
echo "|$CLEANED|"
| RE BOOT |
shopt -q extglob || { echo "Set shell option 'extglob' on.";shopt -s extglob;}
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|
注意: 重击具有extglob
启用选项(shopt -s extglob
)以使用*(...)
语法。
COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n ']}|"
return|REBOOT|
\n
以防止这种情况:COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n']}|"
将返回|RE BOOT|
。
${COMMAND//[$'\t\r\n']}
?我以为${COMMAND//[\t\r\n]}
只会工作,但没有。$
符号的含义是什么,单引号也是什么?
echo "|$COMMAND|"|tr '\n' ' '
将用空格替换换行符(在POSIX / Unix中不是回车符)。
老实说,我会考虑从bash转向更理智的东西。或者首先避免生成格式错误的数据。
嗯,这似乎也可能是一个可怕的安全漏洞,具体取决于数据来自何处。
tr -d '\n'
的下降,而不是更换一个空格
tr '\n' ' ' <<< "|$COMMAND|"
代替echo ... | ...
"|${COMMAND//$'\n'}|"
通过删除所有回车符来清除变量:
COMMAND=$(echo $COMMAND|tr -d '\n')
tr -d '\r'
不是吗?
tr
。只需COMMAND=$(echo $COMMAND)
将给予类似的效果。大概是魔鬼在调用一个新的过程时产生的,但是它对于人类的眼睛来说仍然是短暂而甜蜜的,如果您有一两秒钟的余地,您可能会愿意承受这个打击。
使用bash
:
echo "|${COMMAND/$'\n'}|"
(请注意,此问题中的控制字符是'换行符(\n
),而不是回车符(\r
);后者将REBOOT|
在一行上输出。)
使用Bash Shell参数扩展 ${parameter/pattern/string}
:
的图案被膨胀,以产生一个模式,就像在文件名扩展。扩展参数,并将模式与其值的最长匹配项替换为string。[...]如果string为null,则删除模式匹配项,并且/后面的模式可以省略。
还使用$''
ANSI-C引用结构将换行符指定为$'\n'
。直接使用换行符也可以,尽管不太漂亮:
echo "|${COMMAND/
}|"
#!/bin/bash
COMMAND="$'\n'REBOOT"
echo "|${COMMAND/$'\n'}|"
# Outputs |REBOOT|
或者,使用换行符:
#!/bin/bash
COMMAND="
REBOOT"
echo "|${COMMAND/
}|"
# Outputs |REBOOT|
添加答案以显示使用tr和sed剥离包括\ r在内的多个字符的示例。并说明了如何使用hexdump。
以我|awk '{print $2}'
为例,我发现以awk打印该行最后一项的命令结尾的命令包括回车符\ r以及引号。
我曾经sed 's/["\n\r]//g'
剥去回车和引号。
我也可以使用tr -d '"\r\n'
。
sed -z
如果希望删除\ n换行符,则需要注意一点。
$ COMMAND=$'\n"REBOOT"\r \n'
$ echo "$COMMAND" |hexdump -C
00000000 0a 22 52 45 42 4f 4f 54 22 0d 20 20 20 0a 0a |."REBOOT". ..|
$ echo "$COMMAND" |tr -d '"\r\n' |hexdump -C
00000000 52 45 42 4f 4f 54 20 20 20 |REBOOT |
$ echo "$COMMAND" |sed 's/["\n\r]//g' |hexdump -C
00000000 0a 52 45 42 4f 4f 54 20 20 20 0a 0a |.REBOOT ..|
$ echo "$COMMAND" |sed -z 's/["\n\r]//g' |hexdump -C
00000000 52 45 42 4f 4f 54 20 20 20 |REBOOT |
这是相关的: 什么是回车,换行和换页?