You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Awk匹配指定行后替换内容并生成多份对应输出文件?

需求与问题

需要完成以下操作:

  • 在主文件中匹配含“menu”的行,定位到该行向下2行的位置
  • 将主文件中对应行的内容替换为参考文件里的字符串
  • 每个参考项对应生成一个独立输出文件,文件名与参考项名称一致

示例文件

主文件(main)

This week's menu:
Main dish: xxx
Side: yyy

(注:原示例中的[main]标记可忽略,实际处理核心内容)

参考文件(ref)

Day1 Chicken Salad
Day2 Beef Yogurt
Day3 Pork Fruit

(原示例中的[ref]标记可忽略)

预期输出

  • Day1文件内容:
This week's menu:
Main dish: Chicken
Side: Salad
  • Day2文件内容:
This week's menu:
Main dish: Beef
Side: Yogurt
  • 以此类推生成Day3等文件

当前错误代码

我编写的Awk代码无法正常执行,代码如下:

awk -v fname=$1 dish=$2 side=$3 '/menu/ {getline}{$3=dish} {getline;getline;}{$2=side}1' main ref > fname

修正后的Awk代码

# 读取主文件内容并存储,记录menu行位置
NR == FNR {
    main_lines[++main_cnt] = $0
    if ($0 ~ /menu/) {
        menu_line = NR
    }
    next
}

# 处理参考文件有效行(跳过空行和[ref]标记)
$0 !~ /^\[ref\]$/ && NF >=3 {
    fname = $1
    dish = $2
    side = $3

    # 遍历主文件内容,替换对应行并写入文件
    for (i=1; i<=main_cnt; i++) {
        line = main_lines[i]
        if (i == menu_line + 1) {
            sub(/xxx/, dish, line)
        } else if (i == menu_line + 2) {
            sub(/yyy/, side, line)
        }
        print line > fname
    }
    close(fname)
}

使用方法

将上述修正代码保存为fix.awk,在终端执行:

awk -f fix.awk main ref

代码说明

  1. 先读取主文件所有内容到数组,同时记录含“menu”的行号,方便后续定位目标行
  2. 处理参考文件时,每行提取文件名、主菜、配菜信息
  3. 遍历主文件内容,对menu行+1(Main dish行)和menu行+2(Side行)分别替换内容
  4. 每个参考项对应生成独立文件,完成后关闭文件句柄避免资源泄漏

内容的提问来源于stack exchange,提问作者EverLearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:19