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

Linux 使用sed替换模式下的第一个匹配项,linux,sed,expression,gnu,Linux,Sed,Expression,Gnu,我有一个包含用户帐户的文件: [account] username = mike password = mike expdate = 2015-02-14 city = blah address = blah [account] username

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

[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值更改为:

因此,只有在第一次出现以下情况后,才应对其进行修改:

username                      = mike
问题是,expdate可以是用户名下任意数量的行


使用GNU sed可以解决这个问题吗?

你可以试试这个
sed

awk '/^username/{u=$3}
     {
       if(u=="mike" && ($1~/expdate/))
       $3="2016-02-14"
     }1' your_file
sed '/mike/,/\[account\]/{s/\(expdate[^=]\+=\).*/\1 2016-02-14/}' yourfile

您可以尝试此
sed

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

这似乎是一个
OScam
pay server;)
手动更改OSCam服务器的配置文件不是一个好办法,需要重新启动才能读取它

此版本基于用户1939168版本
格式不会更改,其空格或制表符是否分隔也无所谓

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
的,所以应该可以正常工作。

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

此版本基于用户1939168版本
格式不会更改,其空格或制表符是否分隔也无所谓

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
,因此应该可以正常工作。

如果
expdate
=
@Jotne之间有选项卡,这可能会失败,谢谢。更新了答案。谢谢。“expdate”和“=”之间总是有空格,所以我加了一个点。我还添加了$来标记用户名的结尾:sed'/username$/,/[account]/{s/(expdate.*=)./\1 2016-02-14/}'如果在
expdate
=
@Jotne之间有选项卡,这可能会失败,谢谢。更新了答案。谢谢。“expdate”和“=”之间总是有空格,所以我加了一个点。我还添加了一个$来标记用户名的结尾:sed'/username$/,/[account]/{s/(expdate.*=)./\1 2016-02-14/}'我没有在这台计算机上安装awk。您使用的是什么操作系统?据我所知,所有的
dreambox
都有它,与
VU+
一样,其他的我在alix pc引擎(amd geode lx800)上运行一个非常简单的busybox版本,我已经在它上面编译了GNU。我建议你使用一些更强大的linux,比如ubuntu。您可以添加
munin
来绘制
OSCam
服务器中的运行情况。这是一个小型服务器,busybox是使用buildroot针对uclibc构建的。Alix pc引擎是一个小型、低功耗的嵌入式平台,不适合像ubuntu这样的完整linux发行版。谢谢,我会查一下munin,看看是否可以编译:)我没有在这台机器上安装awk。你使用的是什么操作系统?据我所知,所有的
dreambox
都有它,与
VU+
一样,其他的我在alix pc引擎(amd geode lx800)上运行一个非常简单的busybox版本,我已经在它上面编译了GNU。我建议你使用一些更强大的linux,比如ubuntu。您可以添加
munin
来绘制
OSCam
服务器中的运行情况。这是一个小型服务器,busybox是使用buildroot针对uclibc构建的。Alix pc引擎是一个小型、低功耗的嵌入式平台,不适合像ubuntu这样的完整linux发行版。谢谢,我将查找munin,看看是否可以编译:)谢谢,但是我没有在这台机器上安装awk。谢谢,但是我没有在这台机器上安装awk。