用于替换文件中的文本块的PowerShell命令 [英] PowerShell command to replace a chunk of text in a file

查看:15
本文介绍了用于替换文件中的文本块的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)-单行模式。

Mjolinor提出了一个很好的观点,在替换文本包含可以解释为正则表达式特殊变量的字符的情况下,例如$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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆