如何搜索并复制目标关键词所在的文本分隔块内容?
问题描述
我有一个结构如下的大型文本文件:
--- NAME: Some Name Random number of lines with info. --- NAME: Another Name Random number of lines with different info. --- …
当搜索“different”这类关键词时,我希望将包含该关键词的对应块(从“NAME: Another Name”到下一个“---”)提取到新文件中,若存在多个匹配块,需全部收集到同一文件。目前使用grep different file.txt > edit.txt仅能提取含关键词的单行,不知如何提取整个分隔块,请问grep是否是合适的工具?
解决方案
grep不太适合处理这种块级内容提取的需求,它主打单行匹配,对付跨多行的块效率和灵活性都不够。更推荐用awk或者sed这类工具,它们天生擅长处理结构化的多行文本。
方法一:用awk快速提取
awk可以直接把---当作块分隔符,筛选出包含目标关键词的块:
awk -v RS='---' '/different/ {print "---" $0}' file.txt > edit.txt
-v RS='---':把---设为记录分隔符,每个---之间的内容会被当作一个独立的块。/different/:只保留包含"different"的块。print "---" $0:输出时重新加上---,保持原文件的块结构。
方法二:用sed精准定位块
sed通过区间匹配来锁定块,再检查关键词:
sed -n '/NAME:/,/---/{/different/{:a;N;/---/!ba;p}}' file.txt > edit.txt
/NAME:/,/---/:先定位从"NAME:"开头到下一个"---"结束的文本块。/different/{:a;N;/---/!ba;p}:如果块里有"different",就把整个块的内容读进来并打印。
内容的提问来源于stack exchange,提问作者Jim GBH
相关产品推荐
相关产品推荐

