Linux在特定部分中搜索和替换

时间:2018-05-24 19:13:42

标签: linux bash sed grep

我有一组配置文件,我们希望自动安装 这些文件包含描述模块的部分:

[section 1]
enable = no
...
...
[Section 2]
enable = no
...
...

所以从我的bash脚本开始,我想首先查找[section],然后找到该部分中第一个启用的orcurrance并将其更改为yes。

我一直在寻找sed这样做,但我无法弄清楚如何让它只改变第2节而不是第1节(配置文件可以包含20-30个部分,所有部分都包含一行,其中enable = no )

我尝试使用af grep首先搜索sektion标题,计算行号,然后使用sed搜索并替换linenumber greb返回。

这是非常复杂和艰苦的工作。

任何人都知道如何做到这一点?

1 个答案:

答案 0 :(得分:-1)

只会替换部分中第一行enable =的丑陋解决方案基于合理的方法。
确保每个部分都在他自己的行上。完成后,您可以更改该行的第一个enable= 您可以通过标记更改换行符将部分转换为一行(我将使用\r) 您不需要一个长行,因此通过将[更改为换行符,将每个新部分放在一个新行上。在sed替换后,您可以恢复[和换行符。

tr '\n[' '\r\n' < inputfile |
   sed '/^Section 2\]/ s/enable = [^\r]*/enable = yes/' | 
   tr '\n\r' '[\n'  

此解决方案有一个错误:tr最后一行缺少\n后,导致sed在搜索部分时忽略该行。
我没有找到解决这个问题的好方法,所以我很乐意评论如何改进以下丑陋的修复:

(tr '\n[' '\r\n' < inputfile ; echo) | 
   sed '/^Section 2\]/ s/enable = [^\r]*/enable = yes/;$ s/$-1/\r/' |
   tr '\n\r' '[\n' | sed '$ d'