gpt4 book ai didi

powershell - 如何使用 PowerShell 替换文件中的一行?

转载 作者:行者123 更新时间:2023-12-03 13:45:18 26 4
gpt4 key购买 nike

我正在尝试使用 PowerShell 读取替换配置文件中的一行。有时此脚本有效,但大多数情况下它不会替换该行。

(Get-Content D:\home\App_Config\Sitecore.config) `
| %{ $_ -replace ' <setting name="Media.MediaLinkServerUrl" value=" "/>',' <setting name="Media.MediaLinkServerUrl" value="https://newurl.com"/>'} `
| Set-Content D:\home\App_Config\Sitecore.config

最佳答案

请尝试以下操作:

$file = 'D:\home\App_Config\Sitecore.config'
$regex = '(?<=<setting name="Media\.MediaLinkServerUrl" value=")[^"]*'
(Get-Content $file) -replace $regex, 'https://newurl.com' | Set-Content $file
* 回复 Set-Content :在 Windows PowerShell 中,它默认使用系统的旧单字节字符编码(基于事件的 ANSI 代码页),因此您可能需要使用 -Encoding明确控制输出文件的编码; PowerShell [Core] 6+ 默认为无 BOM 的 UTF-8。
  • 另请注意所需的 (...)周围Get-Content调用以确保管道可以写回 Get-Content 所在的文件。已阅读。
  • 如果有问题的开始标签( <setting ...> )有可能跨越多行,请使用Get-Content -Raw $file (PSv3+) 将整个文件内容作为单个字符串读取(感谢, deadlydog );
    没有 -Raw , Get-Content返回一个字符串数组,表示输入行。

  • 由于使用正则表达式来匹配您现有的设置,当前在 value="..." 中的任何文本匹配,所以即使重复运行这个命令也能工作。
    相比之下, 你试过什么使用有效文字 ( ... value=" " ) 来查找要替换的内容,并且在第一次成功运行后,该文字不再匹配,后续运行无效。
    上面的命令使用了一种简化的替换方法:
  • (?<=<setting name="Media.MediaLinkServerUrl" value=")是匹配的后视断言( (?<=...) ),但不捕获它匹配的内容:它查找直到并包括开头 " 的部分您尝试替换的值,而不将该前缀作为将被替换的内容的一部分。
  • [^"]*然后匹配整个值,直到但不包括结束 " . ( [^"] 是匹配除 ( ^ ) 和 " 之外的任何字符的字符集,并且 * 查找此类字符的任何(可能为空)序列。
  • 因此,由于正则表达式仅捕获值本身,因此您需要指定的替换字符串就是新值。
  • 关于powershell - 如何使用 PowerShell 替换文件中的一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40679169/

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