【问题标题】:In a shell script, how do I replace the first occurrence of a string, after a different string在 shell 脚本中,如何在不同的字符串之后替换第一次出现的字符串
【发布时间】:2012-08-12 07:00:29
【问题描述】:

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

[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`)

【问题讨论】:

  • 这可以使用 shell,但使用带有 ini 解析库的语言会更容易。

标签: bash sh dash-shell


【解决方案1】:

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
  • 完美,谢谢。一些 sed 语法有点……神秘。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2019-07-02
    相关资源
    最近更新 更多