簡體   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