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
的行之前添加了一个新行 在GNU下,可以编写foo
,sed将其解释为换行符。这在BSD sed下不起作用。因此,不同的版本\n
sed $'/foo/ibar\\\nbaz' file
受激励。@lhf哇,这是有限的。我做了,并用一些据说应该有效的东西更新了答案。你实际上不需要大括号,
$'/foo/s/^/bar\\\n/'
有效。虽然很容易忘记您正在查看的是哪一部分。gnu可以稍微修剪一下:s/^.*foo/bar\n&/
@hustmphrr,但我认为,对于BSD,您的版本将变成$'s/^.*foo/bar\\\\\n&/'
。如果我能在OSX上测试它,我会将它添加到答案中以确定。@John1024对不起,我不知道BSD。