如何用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
相关产品推荐
相关产品推荐

