请求帮助编写两个sed命令:大写字母间加圆点等文本处理
Sed命令实现两个文本处理需求
需求1:在两个及以上连续大写字母之间添加圆点
输入示例
A [BC] XYZ
期望输出
A [B.C.] X.Y.Z.
问题分析
你之前尝试的命令s/[A-Z]\{2\}/&./g存在两个核心问题:
- 仅匹配连续两个大写字母并在其后加圆点,无法实现每个大写字母间的逐一分隔(比如
ABCD会变成AB.CD.,而非A.B.C.D.); - 未处理连续大写字母末尾的圆点添加。
正确命令
sed -e ':loop' -e 's/\([A-Z]\)\([A-Z]\)/\1.\2/g' -e 't loop' -e 's/\([A-Z]\)\([^A-Z]*\)$/\1.\2/'
命令解释
:loop:定义循环标签,用于重复执行替换操作;s/\([A-Z]\)\([A-Z]\)/\1.\2/g:匹配单个大写字母后跟另一个大写字母,在两者之间插入圆点,全局替换;t loop:如果上一步替换成功,跳回loop标签继续循环,直到没有连续大写字母可替换;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的问题是:
- 将大写字母+非小写字母的整体后面加圆点(比如
D6变成D6.,而非D.6); - 仅执行一次替换,无法处理连续大写字母的逐个分隔(比如
FGH会变成FG.H.,而非F.G.H.)。
正确命令
sed -E ':a; s/([A-Z])([^a-z])/\1.\2/g; ta; s/([A-Z])$/\1./'
命令解释
-E:启用扩展正则表达式,避免括号转义;:a:定义循环标签;s/([A-Z])([^a-z])/\1.\2/g:匹配大写字母后跟非小写字符(包括大写、数字、符号),在两者之间插入圆点,全局替换;ta:替换成功则跳回a标签循环,直到所有符合条件的大写字母都被处理;s/([A-Z])$/\1./:处理行尾的大写字母,在其后添加圆点(比如把F.G.H变成F.G.H.)。
内容的提问来源于stack exchange,提问作者coffee9000
相关产品推荐
相关产品推荐

