3

Я надеюсь, что кто-то может уделить мне время, чтобы помочь мне создать пакетный файл или аналогичный для поиска и замены текста в нескольких файлах. Я перепробовал много утилит «поиск и замена», но не нашел того, что делает то, что мне нужно.

Требования следующие: Найти и заменить один и тот же текст в нескольких файлах другим текстом ДЛЯ КАЖДОГО ФАЙЛА.

Пример:

File1.txt, file2.txt, file3.txt все имеют текстовую строку «измени меня, пожалуйста»

для file1.txt заменить текстовую строку «измени меня, пожалуйста» на «файл1 изменен» сохранить как исходное имя файла (file1.txt) для file2.txt заменить текстовую строку «измени меня пожалуйста» на «файл2 изменен» сохранить как оригинальное имя файла (файл2. txt) для file3.txt заменить текстовую строку «измени меня, пожалуйста» на «файл3 изменен» сохранить как исходное имя файла (file3.txt)

7 ответов7

2

Использование команд PowerShell:

Get-Content c:\file1.txt | ForEach-Object { $_ -replace "change me please", "file1 changed" } | Set-Content c:\changed1.txt

Get-Content c:\file2.txt | ForEach-Object { $_ -replace "change me please", "file2 changed" } | Set-Content c:\changed2.txt

оставляет меня с 2 файлами:

changed1.txt

changed2.txt

Может ли какой-нибудь добрый человек сказать мне, как я тогда переименую эти файлы и перезапишу оригиналы:

Изменен1.txt в file1.txt

Измененный2.txt к file2.txt

1

Я нашел проблему с вашим сценарием. Имея $ replaceStr = $ file + 'change', вы добавите файл sting $ в измененный файл. Должно быть: $ replaceStr = 'изменено'

Я изменил это для своих собственных целей, но теперь имена файлов являются динамическими, строка изменяется правильно, а пути не нарушаются.

Не забудьте запустить это первым ...Set-ExecutionPolicy RemoteSigned

Код следует:

$filenames = @(get-childitem -Path "C:\Program Files\Tivoli\TSM\baclient\*.opt" | % { $_.FullName })

        foreach ($file in $filenames) 
        {
            $replacementStr = 'New String' 
            (Get-Content $file) | 
                Foreach-object { $_ -replace 'Old String' , $replacementStr   } | 
             Set-Content $file
             Write-Host Processed $file
        }

JW

1

Powergrep может делать то, что вы просите.

1

Если файлы не слишком большие, вы можете использовать

$filenames = @("file1.txt", "file2.txt", "file3.txt")

foreach ($file in $filenames) 
{
    $replacementStr = $file + ' changed' 
    (Get-Content $file) | 
        Foreach-object { $_ -replace 'change me please' , $replacementStr   } | 
     Set-Content $file
}

Обратите внимание на квадратные скобки (Get-Content $ file), которые означают, что файл считывается в память (отсюда и требования к файлам небольшого размера), но это означает, что файл больше не используется, когда вы собираетесь его записать обратно.

если файлы слишком велики для памяти, вы можете записать их во временный файл, а затем использовать что-то вроде

Cp $tempfilename $file 
rm $tempfilename

скопировать временный файл поверх оригинала и удалить временный файл.

0

Откройте несколько файлов в Notepad++ и можете найти / заменить все открытые файлы.

0
perl -p -i -e 's/change me please/$argv changed/' file1 file2 subdir/*.txt foo/*.xyz

Вы можете скачать Perl (для Windows) из Activestate, Strawberry и т.д.

0

Вы можете использовать eclipse - просто загрузите файлы в проект, следуя инструкциям на следующей странице:

http://www.avajava.com/tutorials/lessons/how-do-i-do-a-find-and-replace-in-multiple-files-in-eclipse.html?page=1

В основном делают поиск по папке, содержащей файлы. Результаты будут отображаться на вкладке поиска. Щелкните правой кнопкой мыши файл, содержащий файлы, которые вы хотите изменить, и выберите «Заменить».

Это изменит все файлы, которые вы хотите. Добавлен бонус за размещение ваших файлов в проекте Eclipse, который может быть полезен разными способами. (Контроль исходного кода, подсветка синтаксиса, модульное тестирование и т.д. И т.д.)

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