[英]sed - replace multiple lines (a whole block of text)
我正在处理以下文本:
... other stuff here..
options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no);
owner("root"); group("log"); perm(0640); stats_freq(0);
bad_hostname("^gconfd$");
};
... other stuff here..
我需要使用sed来添加log_fifo_size(30000);
作为使我的文字看起来像这样的新行:
... other stuff here..
options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no);
owner("root"); group("log"); perm(0640); stats_freq(0);
bad_hostname("^gconfd$");
log_fifo_size(30000);
};
... other stuff here..
我了解如何进行正则表达式工作,只是没有足够的信心去使用它。 因此,非常感谢任何语法解释或任何帮助!
我尝试了以下方法:
$sed -e 's/options.*/TEST/g' syslog.conf
$sed -e '/options.*/ {N; s//TEST/g}' syslog.conf
两者使我离得很近,但距离还不够。
sed -e '/options.*/ {N;N; s//options {/g}' syslog.conf
这是我得到的最接近的东西。 但是由于我不知道 options {
和}
之间的行数 ,所以有点棘手。
我遵循了无数的指南,但是通过文档学习总是很艰难。 我喜欢一个很好的例子,所以我想我想问的是我是否可以从我的情况中创建一个例子来帮助我学习基础知识,然后再学习regex / sed的基础知识。
从您的示例中,您正在插入一行,您可以使用i
sed '/};/i\ log_fifo_size(30000);'
sed '/options {/,/};/ {
s/};/log_fifo_size(30000);\
&/
}' YourFile
以从options {
到};
开始的部分};
换行};
使用log_fifo_size(30000);\\n};
它没有使日志与本节的其余部分对齐...但是可以用更多的代码来完成
假设该部分以};
并且没有};
本节内容中的ar
这可能对您有用(GNU sed):
sed '/^options/,/^};/{/};/{x;s/\S.*/log_fifo_size(30000);/;x;H;g};h}' file
这适用于文件的options
部分。 将每行复制到保留空间中,当它占用最后一行时,用所需的字符串替换前一行副本中除前空格以外的所有空格。 然后追加最后一行并一起打印出两行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.