У меня есть несколько текстовых файлов в каталоге, каждый из которых я хочу заменить каждое вхождение строки 1 setlinewidth на 10 setlinewidth. Как мне сделать это через Windows cmd? Пожалуйста помоги.
2 ответа
У Powershell есть утилиты, которые решат эту проблему без загрузки какого-либо внешнего программного обеспечения или утилит. Проверьте эту статью от сценаристов, это очень хорошо. Также я бы сказал, посмотрите на документацию Set-Content .
Пример:
(Get-Content C:\Scripts\Test.txt) |
Foreach-Object {$_ -replace "oldString", "newString"} |
Set-Content C:\Scripts\Test.txt
Если вы можете установить сторонние утилиты, Gnu sed специально для этого типа операций. Ссылка указывает на версию Windows, размещенную на Sourceforge, которую вы можете загрузить и установить. Это будет синтаксис в приглашении:
for %i in (*.txt) do sed -i "s/1 setlinewidth/10 setlinewidth/g" %i
Примечание: с опцией -i
, sed собирается перезаписывать файлы, о которых идет речь, поэтому убедитесь, что у вас есть легко доступные резервные копии на случай, если что-то пойдет не так.
Если вы не можете установить утилиту sed, это будет намного сложнее, если использовать только встроенный пакетный язык.
Изменить: я собрал небольшой командный файл, который будет выполнять замену без каких-либо внешних инструментов. Сохраните его как foo.cmd
или как вы предпочитаете, и вызовите его из командной строки как: foo.cmd
Предостережение: это написано очень конкретно из примеров в вашем вопросе. Если в начале или конце строки до или после 1 setlinewidth
есть другой текст или даже лишние пробелы, этот пакетный файл не будет работать. Это также сохранит копию исходного текстового файла как с расширением .bak (например, textfile.txt.bak).
@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION
for %%a in (*.txt) do (
echo Processing %%a...
for /f "delims=^ tokens=1" %%i in (%%a) do (
if /i "%%i"=="1 setlinewidth" (
echo 10 setlinewidth>>%%a.new
) else (
echo %%i>>%%a.new
)
)
move /y %%a %%a.bak > nul
ren %%a.new %%a
)