使用sed替换模式下的第一个匹配项

时间:2014-03-12 11:30:16

标签: linux sed expression gnu

我有一个包含用户帐户的文件:

[account]
username                      = mike
password                      = mike
expdate                       = 2015-02-14
city                          = blah
address                       = blah

[account]
username                      = george
password                      = george
city                          = blah
address                       = blah
expdate                       = 2015-02-14

[account]
username                      = hans
password                      = hans
city                          = blah
expdate                       = 2015-02-14
address                       = blah

因此,每个用户帐户都以[account]开头,并且其下方有一些值。

我想使用GNU sed来改变用户" mike"的expdate值。到:

expdate                       = 2016-02-14

所以它应该只在第一次出现后改变它:

username                      = mike

问题是,expdate可以是用户名下面的任意数量的行。

这可以用GNU sed解决吗?

3 个答案:

答案 0 :(得分:3)

awk '/^username/{u=$3}
     {
       if(u=="mike" && ($1~/expdate/))
       $3="2016-02-14"
     }1' your_file

答案 1 :(得分:2)

这似乎是OScam付费服务器;)
手动更改OSCam服务器的配置文件并不是一件好事,需要重新启动才能读取它。

这是基于user1939168版本的版本
格式化不会更改,并且它的空格或制表符是否分开无关紧要。

awk '/^username/{f=$3} f=="mike" && $1=="expdate" {sub(/2015/,"2016")}1'
[account]
username                      = mike
password                      = mike
expdate                       = 2016-02-14
city                          = blah
address                       = blah

这假设user名称出现在expdate之前且它OSCam出现,所以应该可以正常工作。

答案 2 :(得分:1)

您可以尝试此sed

sed '/mike/,/\[account\]/{s/\(expdate[^=]\+=\).*/\1 2016-02-14/}' yourfile