gpt4 book ai didi

bash - Grep | sed -i等效于Windows

转载 作者:行者123 更新时间:2023-12-02 23:35:50 25 4
gpt4 key购买 nike

我正在尝试将此命令复制到PowerShell中:

grep -lR 'Find' ./src | while read filename; do sed -i".bak" 's/Find/Replace/g' "$filename"; done 

到目前为止,我有:
Get-ChildItem "src" -Recurse -File | ForEach-Object { $f = $_; (Get-Content $f) | ForEach-Object { $_ -replace "Find", "Replace" } | Set-Content "$f.tmp"; Move-Item "$f.tmp" $f -Force }

我在说 "filename.tmp" does not exist时遇到错误。我认为以上将在解析时创建文件。任何帮助,将不胜感激。

最佳答案

您很可能已经成为Windows PowerShell对System.IO.FileInfo输出的Get-ChildItem实例的不一致字符串化的受害者-请参阅this answer

解决方法是通过.FullName属性使用显式字符串化,该属性显式返回项目的完整路径。

除了一些优化外,还应用于您的命令:

Get-ChildItem -File -Recurse src | ForEach-Object { 
$f = $_.FullName # !! Explicitly retrieve the full path
(Get-Content $f -Raw) -creplace 'Find', 'Replace' |
Set-Content -NoNewline "$f.tmp"
Move-Item "$f.tmp" $f -Force
}
  • Get-Content -Raw将整个文件作为单个字符串读入内存,这效率更高。
  • -creplace(执行区分大小写的替换,默认情况下sed会执行)区分大小写的替换直接应用于生成的多行字符串并替换所有出现的字符串。
  • -NoNewline(PSv5 +)确保Set-Content不会在要保存的多行字符串中添加额外的尾随换行符(Out-File / >也是如此)。
  • 注意:鉴于Get-Content -Raw会先读取整个文件,因此您甚至可以将修改后的内容写回到同一文件中,而无需中间临时文件和随后的Move-Item调用;也就是说,如果写回同一文件的过程被中断,这样做会带来轻微的数据丢失风险。
  • 同样,尽管您的sed调用保留了扩展名为.bak的原始文件,但您的PowerShell命令却没有。
  • 关于bash - Grep | sed -i等效于Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55154079/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com