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

sed oneliner在另一行之前添加一行,sed,makefile,Sed,Makefile,我需要在带有foo和sed的每一行之前添加一行带有bar 我需要在Makefile中这样做,所以我不能使用I\,因为它需要标准sed中的换行符(不是GNU-sed,例如Mac OS X中的换行符),而这不能在Makefile中完成(至少不是很好) 我找到的解决方案是: sed '/foo/{h;s/.*/bar/;p;g;}' < in > out sed'/foo/{h;s/*/bar/;p;g;}'out 这将保存行,将其内容替换为条,打印新行,恢复旧行(默认情况下打印) 有

我需要在带有
foo
sed
的每一行之前添加一行带有
bar

我需要在Makefile中这样做,所以我不能使用
I\
,因为它需要标准
sed
中的换行符(不是GNU-sed,例如Mac OS X中的换行符),而这不能在Makefile中完成(至少不是很好)

我找到的解决方案是:

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

有更简单的解决方案吗?

BSD sed 这将把
bar
放在带有
foo
的每一行之前:

sed $'/foo/{s/^/bar\\\n/;}' in >out
sed '/foo/{s/^/bar\n/;}' in >out
逗号分隔符 这将把
bar
放在带有
foo
的每一行之前:

sed $'/foo/{s/^/bar\\\n/;}' in >out
sed '/foo/{s/^/bar\n/;}' in >out
工作原理
  • /foo/

    这将选择包含
    foo
    的行

  • s/^/bar\n/

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

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

这可能适合您(GNU-sed):

我不知道你为什么说你需要换行,但如果插入的行需要超过一行,你可以使用bash,这样:

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

受激励。@lhf哇,这是有限的。我做了,并用一些据说应该有效的东西更新了答案。你实际上不需要大括号,
$'/foo/s/^/bar\\\n/'
有效。虽然很容易忘记您正在查看的是哪一部分。gnu可以稍微修剪一下:
s/^.*foo/bar\n&/
@hustmphrr,但我认为,对于BSD,您的版本将变成
$'s/^.*foo/bar\\\\\n&/'
。如果我能在OSX上测试它,我会将它添加到答案中以确定。@John1024对不起,我不知道BSD。