如何用正则递归搜索嵌套文件并输出指定匹配结果
递归提取匹配内容的解决方案
嘿,这个需求我熟,给你两个实用的命令行方案,直接就能得到你想要的空格分隔的匹配结果:
方案一: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
相关产品推荐
相关产品推荐

