Замените содержимое текстового файла регулярным выражением в powershell
У меня есть простой текстовый файл, и мне нужна powershell script для замены некоторых частей содержимого файла.
Мой текущий script следующий:
$content = Get-Content -path "Input.json"
$content -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json"
Можно ли записать его в одну строку без переменной содержимого, например?
Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json"
Я не знаю, как я могу использовать вывод первого get-content commandlet во второй команде без переменной $content? Существует ли автоматическая переменная powershell
Возможно ли сделать больше замен, чем в конвейере.
Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | ??? -Replace 'second regex', 'second replacement' | Out-File "output.json"
Ответы
Ответ 1
Да, вы можете сделать это в одной строке и даже не нуждаться в конвейере, так как -replace
работает с массивами, как вы ожидали бы этого (и вы можете связать оператор):
(Get-Content Input.json) `
-replace '"(\d+),(\d{1,})"', '$1.$2' `
-replace 'second regex', 'second replacement' |
Out-File output.json
(Разрыв строки добавлен для удобочитаемости.)
Скобки вокруг вызова Get-Content
необходимы, чтобы оператор -replace
интерпретировался как аргумент Get-Content
.
Ответ 2
Можно ли записать его в одну строку без переменной содержимого, например?
Да: используйте ForEach-Object
(или его псевдоним %
), а затем $_
для ссылки на объект в конвейере:
Get-Content -path "Input.json" | % { $_ -Replace '"(\d+),(\d{1,})"', '$1.$2' } | Out-File "output.json"
Возможно ли сделать больше замен, чем в конвейере.
Да.
- Как и выше: просто добавьте больше сегментов
ForEach-Object
.
-
Как -replace
возвращает результат, их можно связать в одном выражении:
($_ -replace $a,$b) -replace $c,$d
Я подозреваю, что скобки не нужны, но я думаю, что они облегчают чтение: ясно
более нескольких операторов (особенно если матч/замены нетривиальны) будет
не ясно.