我最近创建了一个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
的内容替换END
和zfiles.txt
之间的连接。
BTW 如果有人能提供一些好的资源来学习正则表达式,我真的很感激。
提前致谢
答案 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掌握正则表达式是一本坚实的书。