Редактирование файлов на месте с помощью однострочников CLI

PowerShell:
Редактирование файлов на месте с помощью однострочников CLI

Как это сделать:

Замена текста в одном файле

Давайте начнем с простой задачи: вы хотите заменить все случаи “oldtext” на “newtext” в файле с именем example.txt. Вот как это можно сделать:

(Get-Content example.txt) -replace 'oldtext', 'newtext' | Set-Content example.txt

Эта однострочная команда читает содержимое, выполняет замену и записывает содержимое обратно в исходный файл.

Редактирование нескольких файлов

Что если вам нужно применить одно и то же изменение к нескольким файлам? Вот подход с использованием цикла:

Get-ChildItem *.txt | ForEach-Object {
  (Get-Content $_) -replace 'oldtext', 'newtext' | Set-Content $_
}

Этот фрагмент находит все файлы .txt в текущем каталоге, заменяя “oldtext” на “newtext” в каждом из них.

Добавление содержимого в начало или конец файлов

Добавление или вставка содержимого также может быть упрощена:

# Вставка в начало
"New first line`n" + (Get-Content example.txt) | Set-Content example.txt

# Вставка в конец
(Get-Content example.txt) + "`nNew last line" | Set-Content example.txt

Здесь мы просто конкатенируем новое содержимое до или после существующего и сохраняем его обратно.

Подробнее

Исторически редактирование на месте чаще ассоциировалось с инструментами Unix, такими как sed и awk. PowerShell, будучи более новым участником, изначально не включает в себя возможность редактирования на месте “из коробки”. Это отчасти связано с его философией дизайна, подчеркивающей важность объектов над потоками текста, в отличие от инструментов Unix, которые обрабатывают большинство входных данных как текст.

Альтернативы PowerShell для этой задачи включают использование традиционных инструментов Unix, доступных в Windows через Cygwin или Подсистему Windows для Linux (WSL). Эти инструменты часто предлагают более краткий синтаксис для редактирования на месте благодаря их ориентации на текст.

С точки зрения реализации, важно отметить, что подход PowerShell включает чтение файла целиком в память, внесение изменений и затем запись его обратно. Хотя это хорошо работает для файлов среднего размера, это может стать неэффективным для очень больших файлов. В таких случаях можно рассмотреть использование методов .NET непосредственно или прибегнуть к альтернативным инструментам, предназначенным для потоковой обработки больших объемов данных.

Несмотря на эти соображения, гибкость и обширный набор функций PowerShell делают его неоценимым инструментом для манипулирования файлами непосредственно из командной строки, особенно для тех, кто уже погружен в экосистему Windows или управляет кросс-платформенными средами.