2015-09-27 124 views
0

我有問題,查找替換另一個字符串和Perl的正則表達式語法替換:正則表達式 - 查找行字符串,但在同一行

我有以下行:

FILEGROUP [PAYMENT_MGMT](NAME = [PAYMENT_MGMT], FILENAME = '$(DefaultDataPath)$(DatabaseName)_PAYMENT_MGMT.ndf', FILEGROWTH = 102400 KB) 

LOG ON (NAME = [SQL_log], FILENAME = '$(DefaultLogPath)$(DatabaseName)_log.ldf', SIZE = 5012 KB, MAXSIZE = 2097152 MB, FILEGROWTH = 102400 MB) COLLATE Slovenian_CI_AS 

所以我必須找到字符串SQL_LOGSIZE僅更換SIZE = = 1024

如何與正則表達式PCRE實現這一目標?目標之前

+0

語言的任何其他部分發生所以在最後以下行應該是:登錄(NAME = [SQL_LOG],FILENAME = '$(DefaultLogPath)$(DatabaseName)_log.ldf',SIZE = ** 1024 ** KB,MAXSIZE = 2097152 MB,FILEGROWTH = 102400 MB)COLLATE Slovenian_CI_AS – Seronjsky

+0

只需匹配並捕獲所有需要更改的值匹配您想要替換的文本。 –

+0

是的,這是我的問題:)我該怎麼做:) – Seronjsky

回答

-1

捕捉一切,把它放回替換:

$x =~ s/^(.*?SQL_log.*?SIZE =)\d+/${1}1024/; 

測試代碼:

$x = "foo SQL_log bar SIZE = 5012 baz"; 
$x =~ s/^(.*?SQL_log.*?SIZE =)\d+/${1}1024/; 
print $x; 

輸出:

foo SQL_log bar SIZE = 1024 baz 
1

我找到了答案!

搜索:

(IGP_log.*?\bSIZE\b\s=)(\s[0-9]+) 

替換:

\1 1024 

${1} 1024 
1

如果你保證你永遠不會對同一行多個記錄SQL_LOG ,或者SQL_log LOG記錄的順序始終爲「NAME =」和「SIZE =」,以下內容應該是安全的解決方案:

s/\b(NAME\s*=\s*\[SQL_log\].+?\bSIZE\s*=\s*)[^,)]*/${1}1024 KB/ 

如果你不能保證「NAME =」和「SIZE =」永遠是按照這個順序,但是你能保證永遠不會有每行一多,你就需要這個,除了:

s/\b(SIZE\s*=\s*)[^,]*(.+?\bNAME\s*=\s*\[SQL_log\])/${1}1024 KB$2/ 
2

再次,所有的解決方案都將所有東西都塞進一個單一的正則表達式中。我不明白爲什麼人們這樣做;它不與

這更清楚地寫爲

if (/NAME \s* = \s* \[SQL_log\]/x) { 

    s/SIZE \s* = \s* \K \d+/1024/x; 

} 
+0

夠公平的。只有一個詭辯 - 在NAME和SIZE之前需要'\ b',以確保FILENAME和MAXSIZE不匹配。 –

相關問題