【问题标题】:Powershell-replace portion of string for multiple filesPowershell-替换多个文件的字符串部分
【发布时间】:2021-03-20 02:14:15
【问题描述】:

我有一个包含多个 sql 文件的文件夹(想想 1,000 多个文件)。我需要做的是遍历文件夹中的所有文件并替换某个部分。

每个文件的内容如下:

CREATE TABLE table_name(
  column1 INT UNSIGNED NOT NULL AUTO_INCREMENT,
  column2 INT UNSIGNED NOT NULL DEFAULT 0,
  column3 VARCHAR(255) NOT NULL DEFAULT '',
  column4 DATETIME NOT NULL DEFAULT (CURRENT_TIMESTAMP),
  column5 DATETIME NOT NULL DEFAULT (CURRENT_TIMESTAMP),
  column6 VARCHAR(32) NOT NULL DEFAULT '',
  column7 TINYINT(1) NOT NULL DEFAULT 0,
  column8 VARCHAR(500) NOT NULL DEFAULT '',
  column9 INT UNSIGNED NOT NULL DEFAULT 0,
  column10 TINYINT(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 5,
AVG_ROW_LENGTH = 4096,
CHARACTER SET latin1,
COLLATE latin1_swedish_ci,
COMMENT = 'generic table comment.';

我的目标是遍历每个文件的整个文件夹,检测(CURRENT_TIMESTAMP) 的位置,并将其更改为CURRENT_TIMESTAMP(不带括号)。我遇到的问题是我似乎不能只对括号进行简单的替换,因为它会将它们从其他列中删除,例如 varchar 或 int 数据类型以及主键并作为一个整体创建表语句。

我的想法类似于

$GetFiles = Select-String -Path "C:\Users\name\NewProject1\Tables\*.sql" -Pattern "(CURRENT_TIMESTAMP)"
foreach ($File in $GetFiles){
$NewContent = Get-Content $File.Path | ForEach-Object {
$_ -replace "(CURRENT_TIMESTAMP)","CURRENT_TIMESTAMP"
}
$NewContent | Set-Content $File.Path
}

但这似乎不起作用,并且将括号保留在 CURRENT_TIMESTAMP 周围。任何想法或建议将不胜感激!

【问题讨论】:

  • -replace 是一个正则表达式运算符,您需要转义括号:-replace "\(CURRENT_TIMESTAMP\)"
  • 谢谢!我知道这一定是我想念的简单得愚蠢的东西。你的回答就像一个魅力。我无法将您的回复标记为答案,但它确实是答案。

标签: mysql regex powershell replace parentheses


【解决方案1】:

-replace 运算符默认为 正则表达式,这就是为什么您需要使用 \ 转义 (),或者手动:

... -replace '\(CURRENT_TIMESTAMP\)','CURRENT_TIMESTAMP'

...或Regex.Escape():

$pattern = [regex]::Escape('(CURRENT_TIMESTAMP)')
... -replace $pattern, ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多