5

У меня есть несколько текстовых файлов в каталоге, каждый из которых я хочу заменить каждое вхождение строки 1 setlinewidth на 10 setlinewidth. Как мне сделать это через Windows cmd? Пожалуйста помоги.

2 ответа2

7

У Powershell есть утилиты, которые решат эту проблему без загрузки какого-либо внешнего программного обеспечения или утилит. Проверьте эту статью от сценаристов, это очень хорошо. Также я бы сказал, посмотрите на документацию Set-Content .

Пример:

(Get-Content C:\Scripts\Test.txt) | Foreach-Object {$_ -replace "oldString", "newString"} | Set-Content C:\Scripts\Test.txt

6

Если вы можете установить сторонние утилиты, 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
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .