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

