【问题标题】:Append line after [stuff] using the sed command使用 sed 命令在 [stuff] 之后追加行
【发布时间】:2016-06-10 13:23:07
【问题描述】:

实际上,我试图在配置文件“testfile”中的节标题之后直接插入一行文本,如下所示:

[default]

[stuff]

[stuff_test]

[end]

目标是在 [stuff] 之后且仅在 [stuff] 之后直接插入一行文本“variable = 1”。这是“testfile”的期望输出

[default]

[stuff]
variable = 1

[stuff_test]

[end]

当我尝试使用 sed 的附加功能时:

sed -i "/[stuff]/ a variable = 1" testfile

我得到以下信息:

[default]
variable = 1

[stuff]
variable = 1

[stuff_test]
variable = 1

[end]

我的问题是为什么它在前三节中插入文本,而不是像我想要的那样只在第二节中插入文本?我尝试使用完全匹配,但我可能有错误的上下文?已经尝试了以下其他努力:

sed -i "/\<[stuff]\>/ a variable = 1" testfile

sed "/\<\[stuff\]\>/ a variable = 1" testfile

这不会在文件中插入任何文本。如何让 sed 仅在“[stuff]”节之后插入?

【问题讨论】:

  • awk 'NF > 0 && $0 ~ /[stuff]/{$0=$0" 变量 = 1"} 1' 文件。用 awk 作为替代
  • 感谢您尝试切特。您的命令实际上与我的第一个示例 sed 命令执行相同的操作,只是它不会将其插入以下行,而是直接在与前三个节相同的行之后,并且不会插入到文件中:即:[default] 变量= 1
  • 你能添加一个示例输出吗?我想不通
  • 问题中包含示例输出,是不是不够清楚?
  • 现在知道了。回答了

标签: linux sed append


【解决方案1】:

地址/[stuff]/ 被解释为正则表达式,即匹配任何包含stuf 字符的行。为了避免解释为括号表达式,您必须转义方括号:

sed -i "/\[stuff\]/ a variable = 1" testfile

【讨论】:

    【解决方案2】:

    awk

    awk 'NF > 0 && $0 ~ /\[stuff\]/{$0=$0RS"variable = 1"} 1' file
    

    检查NF: number of field是否大于零并匹配stuff regex,然后在该行追加RS: record seperator,这是具有预期值的换行

    【讨论】:

    • 有效,所以我对你投了赞成票,但我真的在寻找一个 sed 实现。感谢您的帮助!
    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多