2016-03-08 144 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