用于替换文件中的文本块的PowerShell命令 [英] PowerShell command to replace a chunk of text in a file
本文介绍了用于替换文件中的文本块的PowerShell命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用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
我想替换文本,直到在上面的文件中使用[$(DatabaseName)]。
推荐答案
我会这样做。首先,如果需要获取文件的全部内容,比如替换多行文本,请不要使用Get-Content
。而应使用[IO.file]::ReadAllText()
。
然后使用-replace
运算符,例如:
[IO.File]::ReadAllText("$pwdfoo.sql") -replace `
'(?s).*?(USE [$(DatabaseName)].*)$',"foo`n`$1" > foo.sql
这里我用"foo"替换开头的文本。还要注意的是,为了让-replace
使用的正则表达式跨换行符进行匹配,我在正则表达式前面加上了(?s)
-单行模式。
$1
、$2
等。虽然您可以使用[regex]::escape()
转义正则表达式,但是仍然有PowerShell代码将$<something>
解释为变量或子表达式的开始。在本例中,只需使用-replace
运算符捕获您想要保留的部分,然后在第二步中添加新文本,这是非常简单的变通方法,例如:
$keep = [IO.File]::ReadAllText("$pwdfoo.sql") -replace `
'(?s).*?(USE [$(DatabaseName)].*)$','$1'
$newText + $keep > foo.sql
请注意,在本例中的替换中,我在$1
两边使用了单引号,以防止PowerShell解释任何特殊的PowerShell字符。它有点像C#中的逐字字符串。
这篇关于用于替换文件中的文本块的PowerShell命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文