在特定部分

时间:2016-01-19 11:23:15

标签: linux sed configuration-files

我有一个文件,我想从命令行更改。问题在于它有部分,在某些不同的部分,它具有我需要更改的相同值。

该文件如下:

...

[DEFAULT]

findtime = 600
maxretry = 3

[ssh]

maxretry = 6

我想只改变[DEFAULT]下的maxretry。 也许有一个conifuration命令行搜索配置文件中的部分并更改名为X的值<?p>

我用sed编写的命令改变了所有出现的情况,我只希望在[DEFAULT]之后出现第一次

sudo sed -i "s/\(^maxretry =.*$\)/maxretry = ${NUMBER_OF_RETRIES}/" filename

感谢您的帮助。 感谢

2 个答案:

答案 0 :(得分:2)

使用awk的一种方式:

$ NUMBER_OF_RETRIES=5
$ awk '/^\[DEFAULT\]/{f=1;}f && /^maxretry =/{print "maxretry = "x;f=0;next}1' x=$NUMBER_OF_RETRIES file

首先,我们搜索DEFAULT部分,找到后,设置一个标志。搜索以maxretry开头的行,如果设置了flag,则执行替换。

答案 1 :(得分:0)

您可以检查默认标志,该标志会告诉您是否发生了替换:

awk '!f && /^maxretry =.*$/ {$0="maxretry = 666"; f=1} 1'

请注意,这不会在文件中写入更改,只是将输出重定向到新文件或类似于smth。这种方法非常具体,仅适用于首次出现。 @Guru的答案更通用,可以适用于任意部分(例如,您希望根据部分替换第2,第3次出现)。然而,当针对第一次出现时,这个例子更简单。