sed oneliner在另一行之前添加一行

时间:2015-07-01 01:26:56

标签: sed makefile

我需要在filename.txtbar的每一行之前添加一行foo

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

我找到的解决方案是:

sed

这将保存该行,用sed '/foo/{h;s/.*/bar/;p;g;}' < in > out 替换其内容,打印新行,恢复旧行(并默认打印)。

是否有更简单的解决方案?

2 个答案:

答案 0 :(得分:2)

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下不起作用。因此版本不同。

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '/foo/ibar' file

我不确定你为什么说你需要一个换行符,但只是因为插入的行需要长于一行你可以使用bash所以:

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