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

如何用bash/sed/regex在句点后接小写字母处插入换行符

首次提问,若表述不当敬请谅解,欢迎批评指正

问题概述

我有一份格式如下的超长单词列表(示例):

cow n.
sheep n.horse n.
fly n. , v.chicken n.

需要将其转换为如下格式:

cow n.
sheep n.
horse n.
fly n. , v.
chicken n.

问题细节

列表中存在三种需关注的模式:

1. <char>.<newline># 句点后为换行符
2. <char>.<whitespace>,<whitespace><char>.<newline># 句点后为空格、逗号、空格及字符,示例:fly n. , v.
3. <char>.<char># 句点后同一行紧跟字符

需求为:在句点后同一行紧跟小写英文字母(a-z)的位置插入换行符;仅当句点后接空格+逗号+空格+字符时无需处理,其余所有情况句点后均需添加换行符。

已尝试方案

我用grep测试正则表达式,结果如下:

grep "[a-z].[a-z]" test.txt

cow n.
sheep n.horse n.
fly n. , v.chicken n.

其中正则中的第二个[a-z]会匹配换行后的首个字符,但我只想匹配n.h这类同一行的情况,而非跨行的n.\nh,现需用bash/sed实现句点后插入换行符的需求。


解决方案

直接用sed命令就能处理,命令如下:

sed -E 's/(\.)([a-z])/\1\n\2/g; s/(\. , v\.)([a-z])/\1\n\2/g' test.txt

命令说明:

  • 第一个替换规则s/(\.)([a-z])/\1\n\2/g:匹配句点后直接紧跟小写字母的情况,在两者中间插入换行符,处理sheep n.horse这类场景。
  • 第二个替换规则s/(\. , v\.)([a-z])/\1\n\2/g:专门处理fly n. , v.chicken这种特殊格式,确保 . , v.后面的单词前也插入换行。

如果需要直接修改原文件(建议先备份),可以添加-i参数:

sed -i -E 's/(\.)([a-z])/\1\n\2/g; s/(\. , v\.)([a-z])/\1\n\2/g' test.txt

另外,针对你之前grep的问题,要只匹配同一行的[a-z].[a-z],需要转义句点(避免匹配任意字符),修改命令为:

grep -E "[a-z]\.[a-z]" test.txt

这样就只会命中同一行内句点前后都是小写字母的情况,不会跨行匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:27:27