正则表达式替换配置文件的一部分

时间:2013-05-02 23:49:15

标签: regex shell sed

我最近创建了一个shell脚本来自动执行将文件加载到snmp守护程序中的所有步骤。

最后我需要编辑服务器上的conf文件,我意识到我需要使用正则表达式。

我创建了一个名为 zfiles.txt 的文件,其中包含我需要插入特定范围内的所有内容。

snmptt_conf_files = <<END
/etc/snmp/file-1
/etc/snmp/file-2
...
...
/etc/snmp/file-n  
END

我需要使用snmptt_conf_files = <<END的内容替换ENDzfiles.txt之间的连接。

BTW 如果有人能提供一些好的资源来学习正则表达式,我真的很感激。

提前致谢

2 个答案:

答案 0 :(得分:2)

我想出了一个awk(gnu)单行,希望它有所帮助:

 awk 'NR==FNR{r=$0;next}/END$/&&!f{print;f=1;next}!f{print}/END$/&&f{print r $0;f=0}' RS="\0" zfile.txt RS="\n" file

让我们稍微测试一下:

kent$  cat file
snmptt_conf_files = <<END
/etc/snmp/file-1
/etc/snmp/file-2
...
...
/etc/snmp/file-n  
END

keep1
keep2
keep3

snmptt_conf_files = <<END
/etc/snmp/file-1
/etc/snmp/file-2
...
...
/etc/snmp/file-n  
END

kent$  cat zfile.txt
replace1
replace2
replace3

现在执行一行:

kent$  awk 'NR==FNR{r=$0;next}/END$/&&!f{print;f=1;next}!f{print}/END$/&&f{print r $0;f=0}' RS="\0" zfile.txt RS="\n" file
snmptt_conf_files = <<END
replace1
replace2
replace3
END

keep1
keep2
keep3

snmptt_conf_files = <<END
replace1
replace2
replace3
END

似乎单线为你做的工作。关于正则表达式资源,我认为如果你google它,你将获得&gt; 10k的结果。拿一个你喜欢的,边做边学。

答案 1 :(得分:1)

sed '/snmptt_conf_files = <<END/,/END/{     # for a here-doc block:
  /^END$/b          # if at the end skip rest
  /<<END/!d         # if not first line delete and skip rest... else insert file:
  r zfiles.txt
}' input

至于资源,Jeffrey E F Friedl掌握正则表达式是一本坚实的书。