如何通过Bash调用vim搜索特定字符串附近的目标内容并提取
解决方案
报错原因说明
你遇到的E163报错是因为参数-c "n"误用:n是vim中:next命令的缩写,功能是切换到下一个打开的文件,你仅打开了1个文件自然触发该报错。执行/指定字符串搜索命令后,vim默认会直接跳转到第一个匹配的位置,不需要额外加n命令。
功能实现方案
方案1:基于vim实现
使用ex模式+静默模式运行vim,无需启动可视化界面,直接输出匹配结果:
# 直接打印匹配到的回溯搜索字符串行,示例中先搜索bbb、再反向搜aaa vim -e -s 目标文件路径 <<EOF /第一个搜索字符串 ?第二个搜索字符串 .p qa! EOF
参数说明:
-e:启动vim的ex行编辑模式,跳过可视化界面加载-s:静默运行,屏蔽多余的提示信息/第一个搜索字符串:定位到文件中第一个匹配该字符串的行?第二个搜索字符串:从当前位置向上反向搜索,定位到第一个匹配该字符串的行.p:打印当前行的内容qa!:强制退出不保存文件
如果需要将结果保存到变量或文件,可直接用命令替换/重定向:
# 保存到shell变量 target=$(vim -e -s 目标文件路径 <<EOF /第一个搜索字符串 ?第二个搜索字符串 .p qa! EOF ) # 保存到指定文件 vim -e -s 目标文件路径 <<EOF > 输出文件路径 /第一个搜索字符串 ?第二个搜索字符串 .p qa! EOF
方案2:基于awk实现(更推荐)
不需要依赖vim,用awk单遍扫描文件即可实现,性能更高、命令更简洁:
# 直接打印匹配结果,示例中第一个搜索字符串为bbb,第二个为aaa awk '/第二个搜索字符串/{last=$0} /第一个搜索字符串/{print last; exit}' 目标文件路径
逻辑说明:
- 每扫描到一行匹配第二个搜索字符串的内容,就把整行内容存到
last变量中,持续更新为最新的匹配行 - 第一次扫描到匹配第一个搜索字符串的内容时,直接打印之前存储的最近的
last值,退出扫描
保存到变量/文件的方法:
# 保存到shell变量 target=$(awk '/第二个搜索字符串/{last=$0} /第一个搜索字符串/{print last; exit}' 目标文件路径) # 保存到指定文件 awk '/第二个搜索字符串/{last=$0} /第一个搜索字符串/{print last; exit}' 目标文件路径 > 输出文件路径
内容的提问来源于stack exchange,提问作者mysan
相关产品推荐
相关产品推荐

