GNU sed 4.4替换方括号包裹数字为换行符的正则问题
问题根因
你的sed命令执行后没有任何修改,核心问题是GNU sed默认使用基础正则(BRE)语法:在默认模式下+不会被识别为「匹配1次及以上前序字符」的量词,只会被当成普通的加号字符做字面匹配,所以你写的正则根本没命中任何目标文本,自然不会有替换效果。
可用命令
给你两个可直接在GNU sed 4.4上运行的写法,执行后就能得到你期望的输出:
写法1:默认基础正则模式
给+加上转义符让sed识别它的量词含义,同时把方括号后面的等号也纳入匹配范围(不然等号会残留在文本里):
sed -i 's/\[[0-9]\+\]=/\n/g' sentences.tmp
写法2:扩展正则模式
加-E参数(旧版GNU sed也可以用-r,效果完全一致)启用扩展正则语法,这种模式下+不需要额外转义,写法更简洁:
sed -i -E 's/\[[0-9]+\]=/\n/g' sentences.tmp
踩坑说明
顺便提下你之前试错时遇到的几个问题:
- 你最开始用的
\d是PCRE(Perl兼容正则)的专属语法,sed默认不支持,用[0-9]匹配数字是正确的选择 - 你之前尝试把替换内容改成
xxx也没生效,问题同样出在正则没匹配到内容,和换行符的转义写法无关:GNU sed的替换命令中直接写\n就可以输出换行,不需要写成\\n - 你之前写的正则里给等号加了转义写成
\=是多余的,等号在sed正则里不属于特殊字符,加转义反而可能导致匹配失败
用你提供的测试样例执行上述命令后,输出结果完全符合预期:
declare -a aRecs=( "" "some text" "some more text" "three-digit text")
内容的提问来源于stack exchange,提问作者shamelesshacker
相关产品推荐
相关产品推荐

