Bash脚本实现:匹配目标词后提取对应分段的国家名称
可行的Shell解决方案
针对你描述的文件格式,以下几种Shell工具组合可以精准提取包含目标词的分段对应的国家名称:
方法一:使用awk处理段落模式(推荐)
awk适合处理这种按特定标记分割的段落内容,逻辑清晰且效率高:
awk -v target="你要找的目标词" ' /^Name:/ { # 提取当前分段的国家名称(去掉"Name: "前缀) current_country = substr($0, 6) # 重置目标词匹配标记 match_flag = 0 } # 检查当前行是否包含目标词 $0 ~ target { match_flag = 1 } # 遇到下一个分段开头时,若上一段匹配到目标词则输出国家名 /^Name:/ && prev_match { print prev_country } # 文件末尾处理:若最后一段匹配到目标词,输出对应国家名 END { if (match_flag) print current_country } # 保存上一段的状态 { prev_country = current_country prev_match = match_flag } ' your_file.txt
方法二:简化版awk写法(利用记录分隔符)
通过修改awk的记录分隔符,直接将每个分段作为一个处理单元:
awk -v RS="Name:" -v target="你要找的目标词" ' $0 ~ target { # 提取分段内第一行的国家名(换行前的内容) print substr($1, 1, index($1, "\n") - 1) } ' your_file.txt
注意:文件开头的空记录会被自动忽略,因为它不包含目标词。
方法三:grep + sed组合实现
如果更熟悉grep和sed,可以用行号关联的方式实现:
# 先找到所有包含目标词的行号,再逐个查找对应分段的国家名 grep -n "你要找的目标词" your_file.txt | cut -d: -f1 | while read line_num; do sed -n "1,${line_num}p" your_file.txt | grep -E "^Name:" | tail -n1 done | sort -u
sort -u用于去重,避免同一个国家因多次匹配目标词被重复输出。
内容的提问来源于stack exchange,提问作者victor silva
相关产品推荐
相关产品推荐

