Bash技术疑问:使用tr替换字符串字面量\r\n为\n为何未生效?
问题出在哪?
先给你拆解两个核心错误点:
tr的本质是单字符替换工具:它只能逐个替换单个字符,完全没法处理「多字符字符串」的整体替换。你想把\r\n这个字符串换成\n,但tr '\r\n' '\n'实际逻辑是:把输入里的\r(回车控制字符)换成\n,把\n(换行控制字符)换成\n等于没换——完全不是你想要的「替换字符串组合」的逻辑。- 字符匹配不对应:你变量里的
\r\n是字面量字符串(由\、r、\、n四个普通字符组成),但你传给tr的'\r\n'是控制字符(回车和换行符号),两者根本不是一回事,tr在输入里找不到这些控制字符,自然不会做任何替换。
正确的解决方法
根据你的预期输出,你要替换的是字面量的\r\n字符串,可以用以下两种方式:
方法1:用sed(通用跨平台)
STR="**Line1**\r\nLine2" echo "$STR" echo "$STR" | sed 's/\\r\\n/\\n/g'
解释:sed的s/旧字符串/新字符串/g是标准的全局字符串替换语法,这里要用\\转义\——因为\在sed里是特殊字符,这样才能匹配到字面量的\r\n。
方法2:用Bash参数展开(纯Shell,无需外部工具)
STR="**Line1**\r\nLine2" echo "$STR" echo "${STR//\\r\\n/\\n}"
解释:${变量//旧字符串/新字符串}是Bash内置的全局替换语法,同样需要用\\转义\,确保精准匹配字面量的\r\n。
如果你其实是想处理控制字符\r\n(回车+换行)(比如变量里实际是换行符号而非字面量字符串),那可以调整tr的用法:
# 用$'...'让Bash解析转义字符为真正的控制字符 STR=$'**Line1**\r\nLine2' echo "$STR" # 删除所有\r字符,等价于把\r\n换成\n echo "$STR" | tr -d '\r'
内容的提问来源于stack exchange,提问作者John Bergqvist
相关产品推荐
相关产品推荐

