Подтвердить что ты не робот

Замените содержимое текстового файла регулярным выражением в 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"
4b9b3361

Ответ 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
    

    Я подозреваю, что скобки не нужны, но я думаю, что они облегчают чтение: ясно более нескольких операторов (особенно если матч/замены нетривиальны) будет не ясно.