使用Powershell替换文本文件中的文本块

时间:2019-07-03 14:44:18

标签: powershell

好,在将其标记为重复之前,我已经在StackOverflow上尝试了类似问题中的大多数建议,但是在我的情况下它们都没有起作用,因此在这里我寻求帮助。

首先,这是代码摘录:

$pathConf = "C:\Program Files (x86)\Zabbix Agent\zabbix_agentd.conf"

$searchedText = 
'### Option: Alias
#   Sets an alias for an item key. It can be used to substitute long and complex item key with a smaller and simpler one.
#   Multiple Alias parameters may be present. Multiple parameters with the same Alias key are not allowed.
#   Different Alias keys may reference the same item key.
#   For example, to retrieve paging file usage in percents from the server:
#   Alias=pg_usage:perf_counter[\Paging File(_Total)\% Usage]
#   Now shorthand key pg_usage may be used to retrieve data.
#   Aliases can be used in HostMetadataItem but not in HostnameItem or PerfCounter parameters.
#
# Mandatory: no
# Range:
# Default:'

$replacedText = 
'### Option: Alias
#   Sets an alias for an item key. It can be used to substitute long and complex item key with a smaller and simpler one.
#   Multiple Alias parameters may be present. Multiple parameters with the same Alias key are not allowed.
#   Different Alias keys may reference the same item key.
#   For example, to retrieve paging file usage in percents from the server:
#   Alias=pg_usage:perf_counter[\Paging File(_Total)\% Usage]
#   Now shorthand key pg_usage may be used to retrieve data.
#   Aliases can be used in HostMetadataItem but not in HostnameItem or PerfCounter parameters.
#
# Mandatory: no
# Range:
# Default:
Alias=my.service.discovery[*]:service.discovery'

((Get-Content -path $pathConf -raw) -replace $searchedText, $replacedText) | Set-Content -Path $pathConf

所以在这里,我正在寻找该文本段落,以将该文本段落替换为该文本的另一段落,以便基本上在正确的位置添加一行,但是由于某些原因,这行不通。我尝试添加其他帖子中建议的各种EOL字符,但无济于事。我看过另一篇文章建议循环文件的每一行,但这在上下文中似乎不是最佳的。另外,Select-String $searchedText -Path $pathConf命令不会返回任何内容(不是false,什么也没有),所以我猜问题是找到匹配项而不是替换匹配项。该文件是Win10下的UTF-8。

对于熟悉zabbix的人免责声明,我知道我可以简单地在EOF上添加文本以获得相同的结果,但是我喜欢配置文件井井有条,因此在这里我为解决这个问题而烦恼;)

那么,为了查找和替换该段文本,我在这里缺少什么或做错了什么?谢谢

1 个答案:

答案 0 :(得分:1)

由于仅用文本替换文字文本,因此可以使用String.Replace方法。

(Get-Content -path $pathConf -raw).Replace($searchedText,$replacedText)

-replace运算符使用正则表达式匹配来查找文本。这意味着您将必须在文本中考虑特殊的正则表达式字符并进行相应处理。您可以使用\分别对它们进行转义,也可以使用[regex]::Escape($searchedText)来对整个搜索字符串进行转义。