如何从Bash中的字符串中删除换行符


110

我有以下变量。

echo "|$COMMAND|"

哪个返回

|
REBOOT|

如何删除第一条换行符?


7
为什么将此标记为欺骗?这个问题与删除回车有关。它链接到的所谓重复问题与删除空格有关,仅附带提及回车。
Michael Scheper 2014年

1
@MichaelScheper同意并重新开放。
fedorqui'SO停止伤害

这里的术语很奇怪。Unix的行终止符\n(十六进制0x0A)被称为lie feed(LF);它与字符回车符(CR)\r(十六进制0x0D​​)不同,后者在Windows和许多网络协议中用作两字节行尾序列CR LF中的第一个字节。
三胞胎

Answers:


114

,有一些bashisms:

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)以使用*(...)语法。


1
这是从BASH中的变量剥离换行符的方法。其他答案不必要地需要额外的TR流程。顺便说一句,它还有删除结尾空格的额外好处!
ingyhere

1
请注意,它也从字符串中删除了内部空格... COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n ']}|"return|REBOOT|
Alex Jordan

2
@AlexJordan是的,这是一个通缉的功能:您可以在空格后打个空格\n以防止这种情况:COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n']}|"将返回|RE BOOT|
F. Hauri

2
模式如何运作${COMMAND//[$'\t\r\n']}?我以为${COMMAND//[\t\r\n]}只会工作,但没有。$符号的含义是什么,单引号也是什么?
haridsv

1
关于$''语法,这是ANSI C引号(在wjordans答案中提到)。
chuckx '18

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

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

老实说,我会考虑从bash转向更理智的东西。或者首先避免生成格式错误的数据。

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


日期来自同一服务器上的curl请求,我该如何将其放入新的var中?newvar = $(echo“ | $ COMMAND |” | tr'\ n''')
Matt Leyland

2
是。但是请告诉我,您不允许任何人在没有密码的情况下远程重启服务器...
Robin Green

31
你为什么不使用tr -d '\n'下降,而不是更换一个空格
F. Hauri

3
请鞭打无用的管道!使用tr '\n' ' ' <<< "|$COMMAND|"代替echo ... | ...
F. Hauri

12
@ F.Hauri:还是没用的tr:"|${COMMAND//$'\n'}|"
rici

75

通过删除所有回车符来清除变量:

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

22
那不是换行吗?应该tr -d '\r'不是吗?
Izzy

3
回显未注释的变量将删除所有IFS字符(默认情况下为换行符,空格和制表符)。因此,如果要执行此操作,则应注意所有 IFS字符都会被删除,并且不需要tr。只需COMMAND=$(echo $COMMAND)将给予类似的效果。大概是魔鬼在调用一个新的过程时产生的,但是它对于人类的眼睛来说仍然是短暂而甜蜜的,如果您有一两秒钟的余地,您可能会愿意承受这个打击。
Mike S

我已将问题更新为“换行”,因为它的示例确实表明这是换行而不是回车。这个答案仍然是正确的,但也许应该更新为“换行”而不是“回车”?
本杰明W.

8

使用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|

6

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

其中testVar包含我的变量/脚本输出


4

添加答案以显示使用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   |

这是相关的: 什么是回车,换行和换页?

  • CR == \ r == 0x0d
  • LF == \ n == 0x0a


2

如果使用启用了extglob选项的bash,则可以通过以下方式仅删除结尾的空格:

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

输出:

|
RE BOOT|

或将%%替换为##以仅替换前导空格。


1
这与我从docker命令获得的一些奇怪的输出一样具有魅力。非常感谢!
develCuy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.