我有一个文件,我想从命令行更改。问题在于它有部分,在某些不同的部分,它具有我需要更改的相同值。
该文件如下:
...
[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
感谢您的帮助。 感谢
答案 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次出现)。然而,当针对第一次出现时,这个例子更简单。