You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:15:05