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

请求帮助编写两个sed命令:大写字母间加圆点等文本处理

Sed命令实现两个文本处理需求

需求1:在两个及以上连续大写字母之间添加圆点

输入示例

A
[BC]
XYZ

期望输出

A
[B.C.]
X.Y.Z.

问题分析

你之前尝试的命令s/[A-Z]\{2\}/&./g存在两个核心问题:

  1. 仅匹配连续两个大写字母并在其后加圆点,无法实现每个大写字母间的逐一分隔(比如ABCD会变成AB.CD.,而非A.B.C.D.);
  2. 未处理连续大写字母末尾的圆点添加。

正确命令

sed -e ':loop' -e 's/\([A-Z]\)\([A-Z]\)/\1.\2/g' -e 't loop' -e 's/\([A-Z]\)\([^A-Z]*\)$/\1.\2/'

命令解释

  1. :loop:定义循环标签,用于重复执行替换操作;
  2. s/\([A-Z]\)\([A-Z]\)/\1.\2/g:匹配单个大写字母后跟另一个大写字母,在两者之间插入圆点,全局替换;
  3. t loop:如果上一步替换成功,跳回loop标签继续循环,直到没有连续大写字母可替换;
  4. s/\([A-Z]\)\([^A-Z]*\)$/\1.\2/:处理行尾的大写字母,在其后添加圆点(比如把X.YZ变成X.Y.Z.)。

需求2:给后面未跟小写字母的大写字母添加圆点

输入示例

Ab
[A]
D6
FGH
X"

期望输出

Ab
[A.]
D.6
F.G.H.
X."

注:若需要让非大写的结尾字符(如示例中的6)也添加圆点,可在命令末尾追加s/\([^a-z]\)$/\1./

问题分析

你之前的命令s/[A-Z][^a-z]/&./g的问题是:

  1. 将大写字母+非小写字母的整体后面加圆点(比如D6变成D6.,而非D.6);
  2. 仅执行一次替换,无法处理连续大写字母的逐个分隔(比如FGH会变成FG.H.,而非F.G.H.)。

正确命令

sed -E ':a; s/([A-Z])([^a-z])/\1.\2/g; ta; s/([A-Z])$/\1./'

命令解释

  1. -E:启用扩展正则表达式,避免括号转义;
  2. :a:定义循环标签;
  3. s/([A-Z])([^a-z])/\1.\2/g:匹配大写字母后跟非小写字符(包括大写、数字、符号),在两者之间插入圆点,全局替换;
  4. ta:替换成功则跳回a标签循环,直到所有符合条件的大写字母都被处理;
  5. s/([A-Z])$/\1./:处理行尾的大写字母,在其后添加圆点(比如把F.G.H变成F.G.H.)。

内容的提问来源于stack exchange,提问作者coffee9000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:12:38