我想写一个等价的
find -name "*.xml" | xargs grep -l "Search String"
| xargs perl -p -i -e 's/Search String/Replace String/g'
Run Code Online (Sandbox Code Playgroud)
在powershell中.这就是我提出的.
Get-ChildItem 'D:\code\cpp\FileHandlingCpp\input - Copy' -Recurse |
Select-String -SimpleMatch $src_str |
foreach{(Get-Content $_.path) | ForEach-Object { $_ -replace $src_str, $target_str }}
Run Code Online (Sandbox Code Playgroud)
我收到错误"进程无法访问该文件,因为它正被另一个进程使用".所以我想出了多行版本,如下所示.我现在能够替换现在的字符串,除了$ src_str.$ src_str有什么问题?
$src_str="<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>"
$target_str=""
echo $src_str
foreach ($var in (Get-ChildItem 'D:\code\cpp\FileHandlingCpp\input - Copy' -Recurse
| Select-String -SimpleMatch $src_str).Path)
{
(Get-Content $var) | ForEach-Object { $_ -replace $src_str, $target_str }
| Set-Content $var
}
Run Code Online (Sandbox Code Playgroud)
也许这将有助于回到实现相当于Unix版本的最初目标.这基本上是等效的PowerShell版本.
$search = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'
$replace = 'test'
$dir = 'D:\code\cpp\FileHandlingCpp\input - Copy'
dir -Path $dir -Recurse -Filter *.xml | ForEach-Object {
(Get-Content -Path $_.FullName) -replace $search, $replace |
Set-Content $_.FullName
}
Run Code Online (Sandbox Code Playgroud)
注意 - 注意重写文件时可能发生的文本文件编码更改.如果您需要使用您可以指定输出编码Set-Content的-Encoding参数如ASCII.
小智 5
这花了我一段时间才弄清楚,但我明白了!
这是一个单线。只需转到要开始的文件夹并输入此内容即可。将 file.name(如果需要,可以使用通配符)以及 string1 和 string2 更改为要搜索的文件名以及要替换为 string2 的 string1 。
因此,这会递归地搜索文件夹,并且对于每个文件,它都会用另一个字符串替换一个字符串并保存它。基本上是 Get-Childitem | ForEach-Object 替换并保存。
可以了,好了!
get-childitem -include file.name -Recurse | ForEach-Object { ( Get-Content -Path $_.FullName ) -replace 'string1', 'string2' | set-content $_.fullname }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3371 次 |
| 最近记录: |