如何在bash中匹配任意长度空白后完成字符串搜索替换?
问题排查与解决方案
错误原因
你的正则匹配逻辑本身没有问题,出现内容截断的核心原因是shell对命令的解析异常:
- 如果你实际执行时误将
-e后的正则表达式用双引号包裹,首先表达式内部的"会提前闭合shell的双引号边界,导致整个命令结构破碎,perl拿到的执行代码不完整;其次shell会把$1、$2识别为系统内置的位置变量,默认这两个变量是空值,最终执行后就会出现内容丢失,只剩下name加空格的情况。 - 少部分情况是源文件中存在不可见的控制字符、或者引号为全角中文引号,导致正则匹配异常。
可用修复命令
Perl 版本(更稳定)
将.*替换为[^"]+做精准匹配,避免贪婪匹配异常,严格使用单引号包裹正则段:
perl -pi -e 's/name(\s+)"([^"]+)"/name$1{ "$2" }/' /tmp/test.txt
Sed 版本(无需依赖perl)
sed -i 's/name\(\s\+\)"\([^"]*\)"/name\1{ "\2" }/' /tmp/test.txt
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

