2011-07-22 31 views
3

我有一個像build.properties文件:在groovy中,如何替換特定行上的多個事件?

foo=bar/1.1 
start=/data/home/hudson/Project-1.1/workspace/1.1 
fred=wilma/workspace/1.1 

只有2號線,我想所有的1.1與2.2更換,贈送:

start=/data/home/hudson/Project-2.2/workspace/2.2 

我想出了一個辦法要做到這一點的常規,但我有一種感覺,我要去一下錯誤:

String result = '' 
text.eachLine { line -> 
    if (line =~ /(?m)start=/) 
    result += line.replaceAll('1.1', '2.2') + '\n' 
    else 
    result += line + '\n' 
} 

有一個活潑,更巧妙的方式做到這一點?

回答

2

如果你有你的文件中的一個變量text像這樣:

def text = '''\ 
foo=bar/1.1 
start=/data/home/hudson/Project-1.1/workspace/1.1 
fred=wilma/workspace/1.1''' 

或者做:

def text = new File('props.properties').text 

然後,一個方法(我相信有更多的方式來做到這一點),是做:

String result = text.readLines().collect { 
    it ==~ /^start=.*$/ ? it.replaceAll('1.1', '1.2') : it 
}.join('\n') 

readLines拆分文本字符串列表(上e每行),然後將collect轉換爲新列表,或者是原始行,或者是替換行(如果它以start=開頭)。然後,再將這個字符串列表與它們之間的一個\n字符重新組合成單​​個字符串。

希望這是有道理的,而且是你之後?

+0

完美的,Groovy溶液:d – Xorlev

+0

感謝那...比我所做的更簡潔。我想我之後是一個解決方案,不需要我一行一行地進行迭代。我想知道是否有辦法爲此構建正則表達式。 /(^start.*)(1.1(.*))*$/行。所以我想說「尋找以」開始「開始的行,然後是」1.1和一些文本「......在我們看到行結束之前可能會重複該行,對於這樣的行,取而代之的是第1組,然後根據需要更換「2.2」和第n組。 – DaveyBob

+0

@Davey我相信這樣的事情是可能的,但這取決於你是否需要三行代碼,你可以閱讀和理解未來......或者一行regualr表達式,當你需要改變它時,它是沒有意義的,需要完全重寫;-) –

0

F =新文件( 'TEST1') f.withReader {f.write it.readLine()的replaceAll( '1.1', '2.2')}

+0

這將用2.2替換每一個1.1 ...但我只想以「start」開始的行代替1.1。 – DaveyBob

相關問題