【问题标题】:sed oneliner to add a line before another linesed oneliner 在另一行之前添加一行
【发布时间】:2015-07-02 09:09:47
【问题描述】:

我需要在每行 foo 和 sed 之前添加一行 bar。

我需要在 Makefile 中执行此操作,因此我不能使用 i\,因为它需要标准 sed 中的换行符(不是 GNU sed,例如 Mac OS X 中的换行符),而这不能在Makefile(至少,不是很好)。

我找到的解决办法是:

sed '/foo/{h;s/.*/bar/;p;g;}' < in > out

这将保存该行,将其内容替换为bar,打印新行,恢复旧行(并默认打印)。

有没有更简单的解决方案?

【问题讨论】:

标签: sed makefile


【解决方案1】:

BSD sed

这会将bar 放在每一行之前foo:

sed $'/foo/{s/^/bar\\\n/;}' in >out

GNU sed

这会将bar 放在每一行之前foo:

sed '/foo/{s/^/bar\n/;}' in >out

工作原理

  • /foo/

    这会选择包含foo 的行。

  • s/^/bar\n/

    ^ 匹配行首。因此,对于选定的行,这将替换为行首的bar\n。这有效地在包含foo 的行之前添加了一个新行。

    在 GNU 下,可以写 \n 并且 sed 将其解释为换行符。这在 BSD sed 下不起作用。因此版本不同。

【讨论】:

  • @lhf 哇,这是限制。我做了some reading 并用据报道应该有效的东西更新了答案。
  • 您实际上不需要大括号,$'/foo/s/^/bar\\\n/' 有效。虽然可能更容易忘记您正在查看的部分。
  • gnu 可以稍微修剪一下:s/^.*foo/bar\n&amp;/.
  • @HuStmpHrrr 我认为,对于 BSD,您的版本将变为 $'s/^.*foo/bar\\\n&amp;/'。如果我可以在 OSX 上测试它,我会把它添加到答案中。
  • @John1024 抱歉,我不知道 BSD。
【解决方案2】:

这可能对你有用(GNU sed):

sed '/foo/ibar' file

我不知道你为什么说你需要一个换行符,但如果插入的行需要比一行长,你可以使用 bash 所以:

sed $'/foo/ibar\\\nbaz' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2018-03-02
    • 2021-07-04
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多