Powershell读取文件,搜索模式删除模式,写入相同或新文件

时间:2018-06-09 19:47:56

标签: powershell

我对Powershell非常陌生,我有一项任务需要在项目工作中执行。这是个问题。我有一个多个文件,但一旦代码适用于一个,我可以批量运行它们 文件内容如下所示:

AAA0000XYZZ
BBB0001H0351
CXXXXX  ABCUABSS    22/11/1990
YYY0001H035100001
ZZZ0000XYZZ

这是我到目前为止编写的代码

$pattern = "BBB*H0351(.*?)YYY*H0351"
PS F:\Practice_Codes> $data = get-content PS1.txt
PS F:\Practice_Codes> $Result = $Data -replace $pattern,""
PS F:\Practice_Codes> $Result 

代码不会发出任何错误,但它也不会替换文本中的模式。 任何帮助将不胜感激。提前致谢。如果需要,可以提供更多细节。 Powershell版本

PSVersion                      5.1.16299.431
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.16299.431
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

1 个答案:

答案 0 :(得分:1)

我只能猜到你的意思 请参阅https://regex101.com/r/qen2VS/1

上使用的REgEx的说明

由于需求增加,我们需要更好的单一RegEx
使用alternationbackreference

## Q:\Test\2018\06\10\SO_50777935.ps1
$Text=@"
AAA0000XYZZ
BBB0001H0351
CXXXXX  ABCUABSS    22/11/1990
YYY0001H03510000001
ZZZ0000XYZZ
AAA0001XYZZ
BBB0001H9561
CXXXXX  ABCUABSS    22/11/1990
YYY0001H95610000001
ZZZ0001XYZZ
"@

$Pattern ="(?s)BBB\d+(H0351|H9561).*?YYY\d+\1\d+\r?\n"

$text -replace $pattern
AAA0000XYZZ
ZZZ0000XYZZ
AAA0001XYZZ
ZZZ0001XYZZ

(?S) =单行更改RegEx行为以匹配cr / lf
替代 (H0351|H9561)H0351H9561匹配 反向引用 \1再次匹配(H0351|H9561)找到的结果

脚本替换当前文件夹中所有* .txt文件中的模式:

$Pattern ="(?s)BBB\d+(H0351|H9561).*?YYY\d+\1\d+\r?\n"
ForEach($File in (Get-ChildItem *.txt -File)){
    (Get-Content $File -Raw) -Replace $Pattern | Set-Content $File
}