Git Bash下多文件指定代码块匹配输出的多需求实现
针对.tr文件指定代码块的匹配解决方案
以下所有单行命令均适配Git Bash 2.35.1.windows.2,针对你的四个需求分别给出实现:
需求a:匹配内容前输出文件名,结果间加空行
该命令会在每个匹配到目标模式的文件前输出文件名,不同文件的匹配结果之间用空行分隔:
awk 'FNR==1{if(prev_printed) print ""; prev_printed=0} /# unique_start_tag/{in_block=1; next} /# unique_end_tag/{in_block=0} in_block && /5|55/{if(!file_printed[FILENAME]){print FILENAME; file_printed[FILENAME]=1; prev_printed=1} print}' *.tr
FNR==1:处理每个新文件时,若上一个文件有匹配结果则输出空行/# unique_start_tag/{in_block=1; next}:进入目标代码块时标记状态并跳过标签行/# unique_end_tag/{in_block=0}:退出代码块时取消标记- 仅在代码块内匹配到
5或55时,先输出一次文件名,再打印匹配行
需求b:提取文件内ID行作为标识替代文件名
假设文件内ID行格式为ID : file1,该命令会提取此ID作为文件标识替代文件名输出:
awk '/^ID :/{id=$3} FNR==1{if(prev_printed) print ""; prev_printed=0} /# unique_start_tag/{in_block=1; next} /# unique_end_tag/{in_block=0} in_block && /5|55/{if(!id_printed[id]){print id; id_printed[id]=1; prev_printed=1} print}' *.tr
/^ID :/{id=$3}:提取ID行的第三列作为文件标识- 其余逻辑与需求a一致,仅将文件名替换为提取的ID
需求c:仅输出匹配的模式行而非完整代码块
该命令只打印代码块内匹配到5或55的行,不会输出整个代码块内容:
awk '/# unique_start_tag/{in_block=1} /# unique_end_tag/{in_block=0} in_block && /5|55/{print FILENAME": "$0}' *.tr
- 仅在目标代码块内匹配到指定模式时,输出
文件名: 匹配行的格式
需求d:输出时排除起止标签
上述所有命令均已自动排除# unique_start_tag和# unique_end_tag标签行:
- 通过
next跳过起始标签行的输出 - 结束标签行仅用于切换状态,不会触发打印逻辑
内容的提问来源于stack exchange,提问作者Richard Olsson
相关产品推荐
相关产品推荐

