如何用sed或awk处理配置文件,将_PATTERN_替换为行号?
用sed/awk自动将配置文件ID替换为行号
需求概述
需要将配置文件中ID=_PATTERN_行的占位符_PATTERN_自动替换为该行的行号,作为脚本处理时的唯一标识,无需手动维护ID值。
具体实现方案
方案1:使用awk(推荐)
awk可以直接获取当前行号NR,精准匹配目标行后完成替换,写法简洁直观:
awk '/^ID=_PATTERN_$/ {sub(/_PATTERN_/, NR)} 1' input.conf > output.conf
- 细节解释:
/^ID=_PATTERN_$/:精准匹配以ID=_PATTERN_开头且结尾的行,避免误匹配其他包含该字符串的行sub(/_PATTERN_/, NR):将该行内的_PATTERN_替换为当前行号NR1:awk中非0值表示执行默认动作(打印当前行),确保所有行(处理后的目标行和未匹配的行)都输出到结果文件
如果需要直接修改原文件(注意提前备份),可以通过临时文件中转:
awk '/^ID=_PATTERN_$/ {sub(/_PATTERN_/, NR)} 1' input.conf > temp.conf && mv temp.conf input.conf
方案2:使用sed
sed实现需要借助行号捕获和文本替换,GNU sed下可以这样写:
sed '/^ID=_PATTERN_$/!b;h;s/.*//;x;s/_PATTERN_//;G;s/\n/ /;s/ID= /ID=/' input.conf > output.conf
- 逻辑说明:
/^ID=_PATTERN_$/!b:非目标行直接跳过并打印- 后续通过
h(复制行到缓冲区)、x(交换缓冲区)、G(追加行号)等操作,将行号替换到占位符位置
相比awk,sed的写法更繁琐,因此优先推荐awk方案。
示例验证
输入配置文件input.conf内容:
ID=PATTERN
STATE=window
DIR=_code
GEO=1200x250+0+32
CMDS=cd home
执行awk命令后,输出文件output.conf内容:
ID=1
STATE=window
DIR=_code
GEO=1200x250+0+32
CMDS=cd home
若ID行位于文件第3行,替换后会自动变为ID=3,完全适配行号位置。
内容的提问来源于stack exchange,提问作者Sam Kent
相关产品推荐
相关产品推荐

