如何在bash脚本中去除回车符?终端执行命令正常脚本运行报错
报错原因
该问题是由双引号下的bash转义解析规则导致的:
- 你在sed表达式中使用双引号包裹
"s/[\]r//g",bash执行脚本解析双引号内容时,会将表达式内的单个反斜杠\当作转义符吃掉,最终传递给sed的实际表达式变成了s/[]r//g - sed接收到错误的正则表达式后,会将
[]识别为提前闭合的空字符组,后续的r//g不符合s命令的语法规则,因此抛出未知选项的报错。 - 交互式终端执行时的解析规则和非交互式脚本存在细微差异,因此会出现终端运行正常、脚本执行报错的区别。
解决办法
下面是三种可行的修复方案,按需选择即可:
- 方案1:用单引号包裹sed表达式(最推荐)
单引号不会触发bash的转义解析,内容会原样传递给sed,修改后脚本如下:
#!/bin/bash echo "hell\ro" | sed -e 's/[\]r//g'
- 方案2:双引号下对反斜杠做二次转义
如果必须使用双引号(比如需要在表达式中引用bash变量),需要写2个反斜杠才能让sed拿到正确的单个反斜杠:
#!/bin/bash echo "hell\ro" | sed -e "s/[\\]r//g"
- 方案3:使用GNU sed原生支持的
\r匹配回车
如果你的需求就是删除文本中的回车符,直接用\r匹配写法更简洁,无需额外处理转义:
#!/bin/bash echo "hell\ro" | sed -e 's/\r//g'
内容的提问来源于stack exchange,提问作者Lakmuthudcl
相关产品推荐
相关产品推荐

