我正在尝试使用 PowerShell 替换文件中的一段文本。例如,我有一个 .sql 文件,并且我知道该特定文件中需要替换的 SQL 脚本的确切块。通读一些 PowerShell 替换示例后,PowerShell 似乎以数组形式返回文件内容(每一行代表数组中的一个条目)。
例如:
GO
:on error exit
GO
IF (DB_ID(N'$(DatabaseName)') IS NOT NULL)
BEGIN
ALTER DATABASE [$(DatabaseName)]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [$(DatabaseName)];
END
GO
PRINT N'Creating $(DatabaseName)...'
GO
CREATE DATABASE [$(DatabaseName)] COLLATE SQL_Latin1_General_CP1_CI_AS
GO
USE [$(DatabaseName)]
.......
.........
..... MORE SQL SCRIPT
我想替换上面文件中的文本直到 USE [$(DatabaseName)] 。
以下是我将如何解决这个问题。首先,当您需要获取文件的全部内容以用于替换多行文本等目的时,不要使用Get-Content
。相反,使用[IO.file]::ReadAllText()
.
然后使用-replace
运算符,例如:
[IO.File]::ReadAllText("$pwd\foo.sql") -replace `
'(?s).*?(USE \[\$\(DatabaseName\)\].*)$',"foo`n`$1" > foo.sql
在这里,我将开头文本替换为“foo”。另请注意,要获取所使用的正则表达式-replace
为了匹配换行符,我在正则表达式前面加上前缀(?s)
- 单线模式。
Mjolinor 提出了一个很好的观点,在替换文本包含可以解释为正则表达式特殊变量的字符的情况下,例如$1
, $2
等。虽然您可以使用[regex]::escape()
为了转义正则表达式,仍然有 PowerShell 代码可以解释$<something>
作为变量或子表达式的开头。在这种情况下,解决方法非常简单,只需捕获您想要保留的部分即可-replace
运算符,然后在第二步中添加新文本,例如:
$keep = [IO.File]::ReadAllText("$pwd\foo.sql") -replace `
'(?s).*?(USE \[\$\(DatabaseName\)\].*)$','$1'
$newText + $keep > foo.sql
请注意,在本例中的替换中,我使用单引号$1
这会阻止 PowerShell 解释任何特殊的 PowerShell 字符。它有点像 C# 中的逐字字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)