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

如何用正则递归搜索嵌套文件并输出指定匹配结果

递归提取匹配内容的解决方案

嘿,这个需求我熟,给你两个实用的命令行方案,直接就能得到你想要的空格分隔的匹配结果:

方案一:grep + sed + tr(简洁高效)

这个组合适合快速实现需求,语法简单易懂:

grep -rPo 'little boy writes (-\d+_\d+).*street (\d+)' /tmp/temp_dir | sed -E 's/little boy writes -(\d+_\d+).*street (\d+)/\1 \2/' | tr '\n' ' '

各部分解释:

  • grep -rPo ...:
    • -r:递归遍历/tmp/temp_dir下的所有文件
    • -P:启用Perl兼容正则,支持\d(数字)这类便捷写法
    • -o:只输出正则匹配到的片段,而非整行
    • 正则表达式:精准定位你要的行片段,捕获带负号的数字组合和街道数字
  • sed -E ...:把匹配到的完整片段替换成去掉负号的数字组合和街道数字,用空格分隔
  • tr '\n' ' ':把每个匹配结果的换行符换成空格,最终输出成一行连续的字符串

方案二:find + awk(更灵活可控)

如果需要处理更复杂的匹配逻辑(比如一行多个匹配、自定义输出格式),awk会更合适:

find /tmp/temp_dir -type f -name "*.txt" -exec awk '{
    while (match($0, /little boy writes (-\d+_\d+).*street (\d+)/, match_arr)) {
        sub(/^-/, "", match_arr[1])  # 移除第一个捕获组开头的负号
        printf "%s %s ", match_arr[1], match_arr[2]
        $0 = substr($0, RSTART + RLENGTH)  # 继续处理当前行的下一个匹配
    }
}' {} +

各部分解释:

  • find ... -exec awk ... {} +:递归找到所有.txt文件,交给awk批量处理
  • awk脚本:循环查找每行的所有匹配片段,去掉负号后按要求格式打印,确保一行多个匹配也能全部捕获

两种方案运行后,都会输出你期望的结果:54321_12345 987 12345_54321 789(如果有更多匹配会自动追加)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:52:59