gpt4 book ai didi

PowerShell 命令替换文件中的一段文本

转载 作者:行者123 更新时间:2023-12-04 22:36:32 29 4
gpt4 key购买 nike

我正在尝试使用 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# 中的逐字字符串。

关于PowerShell 命令替换文件中的一段文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5385321/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com