我正在尝试使用以下模式使用正则表达式替换 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 进行任何更改。
你能帮我完成这项工作吗?
正如评论中提到的,该模式与链接的 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")"