使用awk/sed批量修改配置文件:插入ProgramName到指定位置
解决方案
使用 sed 批量处理配置文件
方式一:基于文件名提取ProgramName
因为配置文件名(如ProgramName.conf)和第一行的ProgramName完全一致,直接从文件名截取即可:
for conf in *.conf; do prog_name="${conf%.conf}" # 修改command行并备份原文件(备份为*.conf.bak) sed -i.bak "s/^command=\(.*--name\) artisan/\1 $prog_name artisan/" "$conf" done
方式二:基于文件第一行提取ProgramName
如果需要从配置文件第一行[program:ProgramName]中提取名称(不依赖文件名),可以用sed的缓存空间实现:
for conf in *.conf; do sed -i.bak ' # 匹配第一行的program定义,提取名称存入缓存 /^\[program:/ { s/^\[program:\(.*\)\]/\1/ h } # 处理command行,将缓存的名称插入到指定位置 /^command=/ { G s/--name artisan/--name \x0artisan/ s/\n// } ' "$conf" done
提示:
-i.bak参数会自动创建原文件的备份,若不需要备份,Linux系统可改为-i,macOS系统需改为-i ''。
使用 awk 批量处理配置文件
方式一:基于文件名提取ProgramName
for conf in *.conf; do prog_name="${conf%.conf}" # 处理每一行,替换完成后覆盖原文件 awk -v prog="$prog_name" ' /^command=/ { sub(/--name artisan/, "--name " prog " artisan") } 1' "$conf" > temp && mv temp "$conf" done
方式二:基于文件第一行提取ProgramName
for conf in *.conf; do awk ' # 第一行提取ProgramName NR==1 { match($0, /\[program:(.*)\]/, res) prog = res[1] } # 替换command行的目标内容 /^command=/ { sub(/--name artisan/, "--name " prog " artisan") } 1' "$conf" > temp && mv temp "$conf" done
内容的提问来源于stack exchange,提问作者0x288
相关产品推荐
相关产品推荐

