繁体   English   中英

使用sed替换图案下的第一个匹配项

[英]Replace first match beneath a pattern using sed

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

[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                       = 2016-02-14

因此,仅应在以下情况的首次出现后对其进行更改:

username                      = mike

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

可以用GNU sed解决吗?

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

这似乎是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确实在user名之前,因此应该可以正常工作。

您可以尝试使用此sed

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM