【问题标题】:Reuse matched pattern in inserted or appended line with GNU sed使用 GNU sed 在插入或附加的行中重用匹配的模式
【发布时间】:2016-03-02 00:41:38
【问题描述】:

我正在尝试在带有 sed 的模式之前(分别在之后)插入(分别追加)一行。

也许 awk 会更简单,但我不熟悉它。 这是输入

bar

wow

hee

还有想要的输出:

bar
something
foobar

wow
something
foowow

hee
something
foohee

我用 GNU sed 尝试了以下操作:

sed '/^\(bar\|wow\|hee\)/a something\nfoo\1' input

但它打印了1 而不是匹配的模式。 实际上,我想打印以bar|wow|hee 开头的整行。

【问题讨论】:

    标签: regex shell awk sed text-processing


    【解决方案1】:

    你可以像这样使用替换:

    sed 's/^\(bar\|wow\|hee\)/&\n something\nfoo&/' input
    

    这将用它自己替换已建立的模式,等等....然后它再次自我。

    【讨论】:

    • 是的,这就是我最后所做的,但我对这个解决方案并不满意。虽然它工作得很好,但我认为它不是最优雅的,因为我所做的事情有点复杂(在之前插入行,在之后添加行,即更像是 glenn jackman 的答案)。自从我测试过你的答案后,我投票赞成。
    【解决方案2】:

    sed 可以做的不仅仅是搜索和替换:https://www.gnu.org/software/sed/manual/sed.html

    sed '/^\(bar\|wow\|hee\)/ {
      p
      i\something
      s/^/foo/
    }' file
    

    【讨论】:

    • 谢谢,我错过了打印匹配行的p!现在看起来很明显x)。另外,以s/^/foo 开头的行很好地替换foo,我没想到它会起作用!
    【解决方案3】:

    求救!

    $ awk '/^(bar|wow|hee)$/{print $0 RS "something" RS "foo" $0 RS}'
    

    【讨论】:

    • 这可以很好地完成工作,但是我仍然不喜欢 awk 的黑魔法指令 :)(但我认识到 awk 的力量)
    • sed 解决方案进行比较。哪一个更容易理解?这里只需要知道RS表示记录分隔符,默认为换行符。
    • 什么是 $0 :匹配的模式,还是匹配模式的行?在我的情况下,我必须删除你的第一个 $ 表示行尾的符号,因为我的模式只是一个更复杂行的开头,我想在 'foo' 之后完全打印。
    • 带有锚定/^ .. $/,它将对应于模式,但它表示线条。 ($1、..、$NF 是最多 NF 个字段的字段)。
    • 对,它根据字段分隔符解析行,非常适合结构化数据。我认为 A. W. 和 K. 想用 awk 构建一个 UNIX 数据库工具,但没有继续。
    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 2013-03-11
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多