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

如何在Bash中提取PatterStr().模式之后的指定字符串?

提取PatterStr().后的所有目标单词

完全理解你的需求——不想打印整行,只想精准提取每个PatterStr().后面紧跟的单词,哪怕一行里有多个匹配也不能漏。下面给你几个高效的解决方案,都是处理大文件的好手:

方法1:用Perl(最简洁直观)

Perl的正则全局匹配特性刚好能完美解决这个问题,一行命令就能搞定:

perl -nE 'say join " ", /PatterStr()\.(\w+)/g' your_large_file.txt

解释:

  • -n:让Perl逐行读取文件内容,避免一次性加载大文件到内存,处理超大文件也毫无压力
  • -E:启用Perl的新特性,用来执行后面的代码逻辑
  • /PatterStr()\.(\w+)/g:全局匹配每行中PatterStr().后面的单词(\w+匹配字母、数字和下划线,完全覆盖你示例里的数字场景),每个匹配到的单词会被捕获到分组里
  • join " ", ...:把所有捕获到的单词用空格连接起来,最后用say输出结果

测试你给的示例行:

PatterStr().123232424 hhhhh 9999. test, test32312. PatterStr().11111111 66666666698977. PatterStr().8888

执行命令后会输出:123232424 11111111 8888,完全符合预期。

方法2:用Awk

如果你更习惯用Awk,也可以通过分割字符串的方式实现:

awk -F 'PatterStr()\\.' '{
    for(i=2; i<=NF; i++) {
        split($i, word, /[^0-9a-zA-Z]/)
        printf "%s ", word[1]
    }
} END {print ""}' your_large_file.txt

解释:

  • -F 'PatterStr()\\.':把每行按PatterStr().作为分隔符拆分
  • 循环从第2个拆分后的字段开始(第1个字段是分隔符前的无关内容,我们不需要)
  • split($i, word, /[^0-9a-zA-Z]/):把每个字段按非字母数字字符拆分,取第一个元素就是我们要的目标单词
  • 最后用printf输出,END块里的print ""用来补一个换行,让输出格式更整洁

方法3:用Sed

Sed也能实现,不过写法稍复杂一点:

sed -E 's/.*?PatterStr()\.([0-9a-zA-Z]+)/\1 /g; s/[^0-9a-zA-Z ]//g; s/^ +| +$//g' your_large_file.txt

解释:

  • s/.*?PatterStr()\.([0-9a-zA-Z]+)/\1 /g:把每个PatterStr().及之前的内容替换成捕获到的单词加空格
  • s/[^0-9a-zA-Z ]//g:删除所有非目标字符(避免残留的无关符号)
  • s/^ +| +$//g:去掉开头和结尾的多余空格,让输出更干净

这三个方法都能高效处理大文件,你可以根据自己的工具偏好选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:32:35