在shell脚本中,如何在不同的字符串后替换第一次出现的字符串

时间:2012-08-15 23:00:17

标签: bash sh dash-shell

我有一个简单的配置文件,看起来有点像这样:

[sectionA]
url = value1
username = value2
password = value3

[sectionC]
url = value1
username = value2
password = value3

[sectionB]
url = value1
username = value2
password = value3

我想将SectionB的用户名替换为valueX而不触及SectionA或SectionC的用户名。

我在sed上尝试了一些变体,但据我所知,它似乎在单独的行上运行。

我如何做相同的

  1. 搜索StringA(在本例中为[SectionB]
  2. 查找下一个StringB(username = value2
  3. 替换为StringC('username = valueX`)

2 个答案:

答案 0 :(得分:4)

sed

sed '/sectionB/,/\[/s/username.*/username = valueX/' input

awk

awk -vRS='' -vFS='\n' -vOFS='\n' '
$1~/sectionB/{
    sub(/=.*$/, "= valueX", $3)
}
{
    printf "%s\n\n", $0
}' input

答案 1 :(得分:0)

这个多行的sed应该可以解决这个问题:

sed -E -n '1h;1!H;${;g;s/\[sectionB\]([^[]*)username = [a-zA-Z0-9_]+/\[sectionB\]\1username = valueX/g;p;}' input.txt