Powershell 正则表达式替换:字符串未更改

问题描述 投票:0回答:1

我正在尝试使用以下模式使用正则表达式替换 powershell 中的某些字符组:

/^(thedir[ ]=[ ]")(.)(:[/\])([a-zA-Z0-9])([/\]?.)$/gm

通过使用此说明:

$fileContent = Get-Content $fileToProcess -Raw 
$fileContent -replace '(?m)^(thedir[ ]*=[ ]*")(.)(:[\/\\])([a-zA-Z0-9]*)([\/\\]?.*)$', '$1Z$3Here$5'
Write-Host "New file content is $fileContent"

但它在执行时无法执行任何操作:$fileContent 保持不变。我注意到

/gm
标志很重要,并且在我的指令中丢失了,但我不知道如何设置它们。我尝试在正则表达式中添加
(?m)
前缀,但没有成功(也尝试过
(?smi)
,为什么不呢:)):

$fileContent -replace '(?m)^(thedir[ ]*=[ ]*")(.)(:[\/\\])([a-zA-Z0-9]*)([\/\\]?.*)$', '$1Z$3Here$5'

作为示例,让我们处理包含以下内容的

my.ini

[mysqld]
#skip-innodb

# The TCP/IP Port the MySQL Server will listen on
port=3306
max_allowed_packet=16M


#Path to installation directory. All paths are usually resolved relative to this.
#basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
basedir="C:/MySQL/"

#Path to the database root
#datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/"
datadir="C:/MySQLData/"

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=utf8

并将匹配字符串中的

thedir
替换为
basedir

预期结果请参阅此处

目前,我没有使用前面提到的说明对 $fileContent 进行任何更改。

你能帮我完成这项工作吗?

regex powershell global multiline
1个回答
2
投票

正如评论中提到的,该模式与链接的 regex101 测试套件中的样本值完美匹配:

请注意

-replace
没有副作用 - 它不会就地修改左侧变量(例如 Perl 的
=~
)。

要存储结果字符串,请记住将它们重新分配给新的或现有的变量:

$newFileContents = $fileContents -replace '(?m)^(thedir[ ]*=[ ]*")(.)(:[\/\\])([a-zA-Z0-9]*)([\/\\]?.*)$', '$1Z$3Here$5'
Write-Host "New file contents is:`n$($newFileContents -join "`n")"
© www.soinside.com 2019 - 2024. All rights reserved.