sql - Powershell 和 Regex 来整理生成的 SQL 脚本
问题描述
我正在使用 SQL 包生成更新脚本。
但是我想修改它以删除注释和命令,例如
:setvar DefaultDataPath ""
:setvar DefaultLogPath ""
我已经尝试了几次使用正则表达式编写 powershell 脚本来执行此操作,但似乎无法使其正常工作。
SQL 脚本提取
/*
Deployment script for Genohsis/p:AllowIncompatiblePlatform=True/p:CommentOutSetVarDeclarations=True
This code was generated by a tool.
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
*/
GO
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
SET NUMERIC_ROUNDABORT OFF;
GO
:setvar DatabaseName "Genohsis/p:AllowIncompatiblePlatform=True/p:CommentOutSetVarDeclarations=True"
:setvar DefaultFilePrefix "Genohsis_p_AllowIncompatiblePlatform=True_p_CommentOutSetVarDeclarations=True"
:setvar DefaultDataPath ""
:setvar DefaultLogPath ""
GO
:on error exit
以前的解决方案
我之前使用 TFS 中的 .net 构建任务来完成此操作。这工作得很好,但现在我们已经转移到 DevOps // 删除顶部部分,希望在 powershell 脚本中执行
Regex objRegex = new Regex(@"/\*\r\n:setvar(.*\r\n)*?(?=/\*)");
strFileContents = objRegex.Replace(strFileContents, "");
我的尝试
(Get-Content Upgrade.sql) -replace([Regex]::Escape(':setvar(.*\r\n)*?(?=/\*)'), '') | Set-Content Upgrade_Modified.sql
和
(Get-Content "Upgrade.sql") | ForEach-Object{$_ -replace [Regex]::Escape('(?m)^:setvar.*'), ''} | Set-Content "Upgrade_Output.sql"
两者都不起作用,但我对 powershell 或正则表达式不是很有经验。
非常感谢任何帮助。
谢谢
解决方案
您在此处查找的正则表达式字符串是^:setvar.*
. Regex.Escape方法用于将正则表达式引擎字符(, \
, *
, +
, ?
, |
, {
, [
, (
, )
, ^
, $
,.
和#
空格)转义为文字字符串。此字符串不需要它。
(Get-Content "Upgrade.sql") -replace '^:setvar.*' | Set-Content Upgrade.sql
运算符的固有问题/好处-replace
是默认替换是空字符串。因此,如果您不替换换行符,您的文件中将留下空白行。不使用正则表达式单行模式,.
不会匹配任何换行符。如果要删除整行,除了-replace
. 您可以一起考虑使用不同的运算符。
# for multi-line files as single strings return true/false only
(Get-Content "Upgrade.sql") -notmatch '^:setvar.*' | Set-Content Upgrade.sql
# for single or multi-line files
(Get-Content "Upgrade.sql") | Where {$_ -notmatch '^:setvar.*'} | Set-Content Upgrade.sql
# replacing newline characters
# -Raw switch reads in the file as a single string making newline characters replaceable.
# Now multi-line mode (?m) needs to be used to treat ^ as the beginning of each line
(Get-Content "Upgrade.sql" -Raw) -replace '(?m)^:setvar.*\r?\n' | Set-Content Upgrade.sql
Get-Content
如果没有-Raw
开关,则将文件的每一行作为数组元素读取。因此,无论预输出替换如何,该数组的输出都将在每个元素之间添加换行符。
推荐阅读
- python - Python - 解析来自 STDIN 的多行数据以存储在标准数组中
- python - 在导入的类中使用来自另一个文件的全局变量
- django - 如何将自定义 Django 身份验证与其余 TokenAuthentication 一起使用
- php - Laravel 如何从 config\app.php => providers 自动加载所有提供者类
- ssl - HTTP 上的时间戳签名是否容易受到攻击?
- docker - 使用 pipenv 在 docker 中安装 python fork
- spring-boot - Resilience4j 隔板 线程行为
- linux - 如何将 OpenSSL 用于具有自定义 CA 和正确 SAN 设置的自签名证书?
- python - 为什么输入函数不返回任何内容?
- c# - 如何将编辑后的 System.Drawing.Bitmap 保存到同一个文件