2015-09-27 23 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不匹配。 –

相关问题