powershell - 如何 - 仅查找和替换第一个匹配项
问题描述
我有一个似乎可以正常工作的脚本,只有它才能正常工作。我的文件包含多行字符串“PROCEDURE DIVISION。”,句号在末尾。
我需要做什么...
仅删除字符串“PROCEDURE DIVISION”的 [第 2 次出现]。如果它在文本文件中两次,如果只找到一次则绕过文件。我需要保留第一次出现并更改/删除第二次出现。
我可以轻松找到并替换所有出现,我不知道如何只替换 2 个中的 1 个。
这可以使用Powershell吗?
到目前为止,这是我的代码...
Get-ChildItem 'C:\Temp\*.cbl' -Recurse | ForEach {#
(Get-Content $_ | ForEach { $_ -replace "PROCEDURE DIVISION\.", " "}) | Set-Content $_
}
更新
我得到了这个工作,它并不漂亮。
唯一的问题是在评论部分捕获字符串。我需要做的只是当字符串从每行的第 8 位开始时才算作命中。
那可能吗?
Get-ChildItem 'C:\Thrivent\COBOL_For_EvolveWare\COBOL\COBOL\*.*' -Recurse | ForEach {
($cnt=(Get-Content $_ | select-string -pattern "PROCEDURE DIVISION").length)
if ($cnt -gt "1") {
(Get-Content $_ | ForEach { $_ -replace "PROCEDURE DIVISION\.", " "}) | Set-Content $_
$FileName = $_.FullName
Write-Host "$FileName = $cnt" -foregroundcolor green
}
解决方案
你可以用switch
这个:
Get-ChildItem -Path 'C:\Temp' -Filter '*.cbl' -File -Recurse | ForEach-Object {
$occurrence = 0
$contentChanged = $false
$newContent = switch -Regex -File $_.FullName {
'PROCEDURE DIVISION\.' {
$occurrence++
if ($occurrence -eq 2) {
$_ -replace 'PROCEDURE DIVISION\.', " "
$contentChanged = $true
}
else { $_ }
}
default { $_ }
}
# only rewrite the file if a change has been made
if ($contentChanged) {
Write-Host "Updating file '$($_.FullName)'"
$newContent | Set-Content -Path $_.FullName -Force
}
}
推荐阅读
- java - 存储库中缺少 org.renjin.cran 库
- dialogflow-es - Google Dialogflow 自定义负载是否在 Telegram 中具有调用功能?
- javascript - API 端点在不等待承诺的情况下返回有什么缺点吗?
- html5-canvas - 如何调试 HTML5 canvas pixi.js 性能?
- typescript - 打字稿:类型“字符串”不能用于索引类型“{ [key: string]: any; }”
- python - 当我运行“python manage.py runserver”时,git bash 冻结
- php - 将 Woocommerce 订单号转换为 Gravity Perks 嵌套表格
- python - Django - AttributeError:'tuple'对象没有属性'get'[DRF,Stripe,Python]
- ruby-on-rails - 错误显示如下:字段“signoutUser”不接受参数“输入”
- r - 使用 rvest 包的 url 表