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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:54:03