sed - 替换多行(整个文本块)

时间:2013-12-05 14:47:50

标签: regex bash sed

我正在操作以下文字:

... 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的基础知识。

3 个答案:

答案 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部分。将每一行复制到保留空间中,当它绕过最后一行时,用所需的字符串替换前一行副本中除前面空格之外的所有空格。然后追加最后一行并将两行打印在一起。