我正在操作以下文字:
... 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..
我理解regexp如何工作,只是没有足够的信心使用它。 因此,非常感谢任何语法和/或任何帮助的解释!
我尝试了以下内容:
$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 {
和}
之间的行数,这有点棘手。
我跟随过无数的导游,但我总是花时间学习文档。我喜欢一个很好的例子,所以我想我是否可以帮助创建一个我的情况的例子,我可以用它来学习基础知识,然后学习正则表达式/ sed的基础知识。
答案 0 :(得分:4)
在您的示例中,您要插入一行,您可以使用i
sed '/};/i\ log_fifo_size(30000);'
答案 1 :(得分:2)
sed '/options {/,/};/ {
s/};/log_fifo_size(30000);\
&/
}' YourFile
从options {
开始,直至};
使用};
log_fifo_size(30000);\n};
它没有将日志与其余部分对齐,但可以使用更多代码完成
这假设该部分与部分内容中的};
并且没有};
ar关闭
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed '/^options/,/^};/{/};/{x;s/\S.*/log_fifo_size(30000);/;x;H;g};h}' file
这适用于文件的options
部分。将每一行复制到保留空间中,当它绕过最后一行时,用所需的字符串替换前一行副本中除前面空格之外的所有空格。然后追加最后一行并将两行打印在一起。