如何使用sed命令将带点英文缩写(如U.S.A.)替换为无点形式
解决带点英文缩写的sed替换问题
我来帮你搞定这个精准替换的需求!你想要只去掉引号外的大写字母缩写中的句点(比如U.S.A.→USA,D.A.R.P.A.→DARPA),同时保留其他句点和引号内的内容,之前的命令要么太粗暴删了所有点,要么因为sed正则语法问题失效,这就给你正确的方案:
正确的sed命令
针对GNU sed(Linux系统默认)和BSD sed(macOS默认)都兼容的命令:
sed -E ':a; s/(^|[^"])([A-Z])\./\1\2/g; ta' file.txt > file2.txt
命令详解
咱们拆解一下这个命令为什么能满足需求:
-E:启用扩展正则表达式,不用额外转义括号、|这些符号,写起来更直观:a:定义一个循环标签a,用来反复处理连续的句点缩写s/(^|[^"])([A-Z])\./\1\2/g:核心替换规则:(^|[^"]):匹配行首或者非引号的普通字符,确保我们只处理引号外面的内容([A-Z])\.:匹配单个大写字母加句点的组合,把大写字母捕获到分组里\1\2:替换成前面捕获的内容(行首/普通字符 + 大写字母),直接去掉句点
ta:如果刚才的替换成功了,就跳回标签a继续循环处理,直到把所有符合条件的句点都去掉(比如D.A.R.P.A.会一步步变成DARPA)
测试效果
假设你的输入文本是:
This is U.S.A. and D.A.R.P.A. example. "Don't touch U.S.A. inside quotes." Another example: F.B.I. vs C.I.A.
执行命令后输出会是:
This is USA and DARPA example. "Don't touch U.S.A. inside quotes." Another example: FBI vs CIA
完全符合你的要求:引号外的缩写去掉了所有句点,引号内的内容原封不动,其他句点(比如句末的)也保留了。
为什么之前的命令不行?
sed "s/.//g":这个命令会匹配所有句点并删除,太粗暴,完全没区分缩写和其他句点sed "s/([A-Z]\.)+/[A-Z]/g":首先sed默认用基础正则,+和未转义的()都不被支持;其次就算语法正确,这个规则会把一整串[A-Z]\.替换成单个大写字母,比如U.S.A.会变成A,显然不是你想要的结果
内容的提问来源于stack exchange,提问作者ketan Shah
相关产品推荐
相关产品推荐

