[英]To replace a immediate text after pattern match in Linux shell using 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.