如何编写Bash脚本提取stdin中符合规则的句子逐行输出到stdout
Bash句子匹配脚本实现方案
原脚本问题梳理
- 你代码中用到的
SENFLAG变量没有做任何初始化赋值,if判断分支永远不会执行 - 正则规则完全不符合需求:既没有匹配大写字母开头的要求,也没有匹配句号、感叹号、问号结尾的规则,也无法正确拆分同一行内的多个句子
- 逐行读取的循环逻辑冗余,无需额外循环即可直接通过文本处理工具完成需求
最简实现方案
基于GNU grep的实现,适配绝大多数Linux发行版:
#!/bin/bash # 直接读取标准输入,输出符合要求的句子 grep -oP '[A-Z][^.!?]*[.!?]'
规则说明
-o参数:让grep只输出匹配到的内容,每个匹配结果单独占一行-P参数:启用Perl正则语法- 正则含义:
[A-Z]:匹配句首的大写字母[^.!?]*:匹配除三个结束符之外的任意字符,匹配次数不限[.!?]:匹配句尾要求的三个结束符之一
跨平台兼容方案
如果是 macOS 等默认没有GNU grep的环境,可以用awk实现相同功能:
#!/bin/bash awk '{ while(match($0, /[A-Z][^.!?]*[.!?]/, res)) { print res[0] $0 = substr($0, RSTART + RLENGTH) } }'
效果验证
输入你给出的测试文本:
This is the first sentence. This is the second sentence! Is this the third sentence? this is not a sentence
输出结果和预期完全一致:
This is the first sentence. This is the second sentence! Is this the third sentence?
内容的提问来源于stack exchange,提问作者George0541
相关产品推荐
相关产品推荐

