2016-03-08 120 views
1

我需要在某个匹配后向现有文件插入命令(作为字符串)。现有的字符串是一个长命令,我只需要通过在特定位置插入另一个字符串来修改它。我尝试过使用sed,但它会在匹配字符串之前/之后添加一个新行或替换它。我想知道至少是否有可能用sed完成我想要的功能,还是应该使用其他功能?你能否给我提供一些提示?sed在同一行上匹配模式后插入字符串

例子:

该文件包含两个make命令,我只在第二个没有bbnote感兴趣。

oe_runmake_call() { 
     bbnote make -j 8 CROSS_COMPILE=arm-poky-linux-gnueabi- CC="arm-poky-linux-gnueabi-gcc" "[email protected]" 
     make -j 8 CROSS_COMPILE=arm-poky-linux-gnueabi- CC="my_command_here arm-poky-linux-gnueabi-gcc" --sysroot=/some/path "[email protected]" 

} 

在此先感谢!

下面的代码: http://hastebin.com/tigatoquje.go

+0

什么是预期输出? – Munir

+0

@丹尼什么和你在哪里试图添加一些东西? – jkdba

+0

我需要在CC =“ – danny

回答

0

你可以使用桑达做这样的事情:

sed -r 's:(^\s+make.+ CC=\"):\1your_command_here :g' file.log >outfile.log 

或sed的就地编辑:

sed -ir 's:(^\s+make.+ CC=\"):\1your_command_here :g' file.log 

没有sed的正则表达式选项:

sed 's:\(^\s\+make.\+ CC=\"\):\1your_command_here :g' file.log > outfile.log 

输出:

oe_runmake_call() { 
     bbnote make -j 8 CROSS_COMPILE=arm-poky-linux-gnueabi- CC="arm-poky-linux-gnueabi-gcc" "[email protected]" 
     make -j 8 CROSS_COMPILE=arm-poky-linux-gnueabi- CC="your_command_here arm-poky-linux-gnueabi-gcc" --sysroot=/some/path "[email protected]" 

} 

如何:

sed -r 's:(^\s+make.+ CC=\"):\1your_command_here :g'

-r =正则表达式选项

^make(CC=\") =开始与制造商和设置捕获组上CC="

\1your_command_here = \1参考捕获组然后添加命令文本

+0

”之后插入第二个字符串(命令),感谢您的回复!我认为这是我正在寻找的内容,但它抱怨“不匹配”。 我删除了外部双引号,并将它们替换为单引号,因为已经有一个正在匹配且没有关闭。它仍然不起作用:( – danny

+0

请确保你使用'-r'选项 – jkdba

+0

@danny尝试“没有sed正则表达式选项”,我刚刚添加到我的答案。 – jkdba

0

您可以使用perl。

用你想添加的东西替换YOUR_COMMAND。这假设您的文件在file.txt

perl -i.bak -pl -e '/^make/ and s/(CC=".*")/$1 YOUR_COMMAND /' file.txt