Замена блока текста в текстовом файле с помощью powershell - PullRequest
0 голосов
/ 03 июля 2019

Хорошо, прежде чем это будет помечено как дубликат, я попробовал большинство предложений в похожих вопросах на 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 ничего не возвращает (не ложь, просто ничего), поэтому я предполагаю, что проблема в том, чтобы найти соответствие, а не заменить его. Файл UTF-8 под Win10.

Отказ от ответственности для тех, кто знаком с zabbix, я знаю, что могу просто добавить текст в EOF для тех же результатов, но мне нравятся мои файлы конфигурации, хорошо организованные, поэтому здесь я ломаю голову над этой проблемой;)

Так что же я здесь упускаю или делаю не так, чтобы найти и заменить этот абзац текста? Спасибо

1 Ответ

1 голос
/ 03 июля 2019

Поскольку вы просто заменяете буквенный текст текстом, вы можете использовать метод String.Replace.

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

Оператор -replace использует поиск по регулярному выражению для поиска текста.Это означает, что вам придется учитывать специальные символы регулярных выражений в вашем тексте и соответственно с ними обращаться.Вы можете по отдельности экранировать их с помощью \ или использовать [regex]::Escape($searchedText), чтобы экранировать всю строку поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...