我对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
答案 0 :(得分:1)
我只能猜到你的意思 请参阅https://regex101.com/r/qen2VS/1
上使用的REgEx的说明 由于需求增加,我们需要更好的单一RegEx
使用alternation和backreference
## 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)
与H0351
或H9561
匹配
反向引用 \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
}