2013-01-08 79 views
-1

我有這樣一些代碼:插入代碼只

void main() { 
//---------- 
    var a; 
    var b; 
    var c =[]; 
    var c = func(3); 
    if (a == b) { 
    print "nested"; 
    }  
//---------------- 
} 

我想選擇在括號之間的內部,這是我曾嘗試:

sed -re ':l;N;$!tl;N;s!(void \w+\(\) \{)([^])*!\1 Prepend;\n\2\nappend!g' test.txt

編輯:

我想第一次出現後插入代碼以及最後一次出現}之前。

例子:

void main() { 
test1 
//----------------- 
    var a; 
    var b; 
    var c =[]; 
    var c = func(3); 
    if (a == b) { 
    print "nested"; 
    } 
test2 
//----------------- 
} 
+0

嘗試'awk'並忽略包含大括號的行。 –

回答

-1

試試這個正則表達式:

{[^]*} // [^] = any character, including newlines. 

的JavaScript正則表達式的例子工作:

var s = "void main() {\n//----------\nvar a;\nvar b;\nvar c =[];\nvar c = func(3);\n//----------------\n}" 
console.log(s.match(/{[^]*}/g)); 
//"{↵//----------↵var a;↵var b;↵var c =[];↵var c = func(3);↵//----------------↵}" 

(我知道這是不是JS的問題,但它用於說明正則表達式返回期望的結果。)

+0

這個問題被標記爲'sed',它不是JavaScript。 – Amber

+0

@Amber:這並不意味着JS不能用來說明一個正則表達式的工作原理。 – Cerbrus

+1

當正則表達式引擎以完全不同的方式運行時,它不是一個有用的答案。 – Amber

-1

sed默認情況下在單行上運行。它可以通過使用N命令在模式空間中讀取多行代碼來在多行上運行。

例如,下面的sed表達式將加入連續行的文件,它們之間@符號:

sed -e '{ 
N 
s/\n/ @/
}' 

(實例http://www.thegeekstuff.com/2009/11/unix-sed-tutorial-multi-line-file-operation-with-6-practical-examples/

+0

這可能會回答如何運行多行正則表達式,但這並不能回答他如何匹配括號內的代碼片段('{}')的實際問題。 – Cerbrus

+0

我使用N和多行,但我無法反向引用括號內的insode部分。我需要追加並在其中添加一些內容。你可以舉一些例子,我可以在前面添加'TEST1'並在括號內添加'TEST2' – user175386049

+0

@ user1953864如果這是你需要做的事情,我建議做的事情是運行兩個修改 - 首先,添加'TEST1'與'{'一致,然後在'}'行的前面加上'TEST2'。 – Amber

3

我覺得awk是你一個更好的解決方案其實想做的事:

$ awk '/{/{i++;if(i==1){print $0,"\ntest1";next}}{print}/}/{i--;if(i==1)print "test2"}' file 
void main() { 
test1 
//----------------- 
    var a; 
    var b; 
    var c =[]; 
    var c = func(3); 
    if (a == b) { 
    print "nested"; 
    } 
test2 
//----------------- 
} 

說明:

下面是一些解釋性評論在多形式的腳本,如果你以這種形式更喜歡將其保存到一個文件說nestedcode並運行它像awk -f nestedcode code.c

BEGIN{ 
    #Track the nesting level 
    nestlevel=0 
} 
/{/ { 
    #The line contained a { so increase nestlevel 
    nestlevel++ 
    #Only add code if the nestlevel is 1 
    if(nestlevel==1){ 
     #Print the matching line and new code on the following line 
     print $0,"\ntest1" 
     #Skip to next line so the next block 
     #doesn't print current line twice 
     next 
    } 
} 
{ 
    #Print all lines 
    print 
} 
/}/ { 
    # The line contained a } so decrease the nestlevel 
    nestlevel-- 
    #Only print the code if the nestleve is 1 
    if(nestlevel==1) 
     print"test2" 
} 
+0

我已更新問題 – user175386049

+0

@ user1953864我已更新我的答案 –

+0

我有很多像我的文件與mnay括號中的功能,所以我不能只使用括號作爲搜索事物 – user175386049

2

這可能會爲工作你(GNU SED):

sed '/^void.*{$/!b;:a;/\n}$/bb;$!{N;ba};:b;s/\n/&test1&/;s/\(.*\n\)\(.*\n\)/\1test2\n\2/' file 
  • /^void.*{$/!b如果該行不void開始,在{保釋出來結束(這可能需要根據您的需要量身定製)。
  • :a;/\n}$/bb;$!{N;ba}如果該行僅包含一個換行符後跟一個},則跳轉到標籤b,否則將在下一行中讀取並循環回標籤a
  • :b開始替換在這裏。
  • s/\n/&test1&/第一個換行符插入第一個字符串後。
  • s/\(.*\n\)\(.*\n\)/\1test2\n\2/第二個換行符後面插入第二個字符串。
+0

我確實瞭解你的代碼。你能否請你逐字解釋每個人正在做什麼。我是新來的正則表達式和SEED,我沒有得到。另外,我不得不提出一個新的問題來理解這一點 – user175386049