поиск по регулярному выражению заменить в партии - PullRequest
3 голосов
/ 11 августа 2011

Я хочу выполнить поиск / замену с помощью шаблона регулярных выражений в пакете Windows для набора файлов.Это будет что-то вроде:

if the regex matches a line matches then replace it with a new line.

также мне нужно добавить переменную в регулярное выражение, чтобы просто заменить значение.Кто-нибудь знает, как бороться с пакетным скриптом?Я не настолько знаком с этим.Некоторые примеры могут быть полезны.

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Вы можете воспользоваться командой findstr . Он поддерживает регулярные выражения с ограниченным синтаксисом. Скажем, у вас есть файлы

ignore_me.txt
rename_me01.txt
rename_me02.txt
rename_me03.txt
rename_me04.txt

Команда

dir /b | findstr "rename_me[0-9][0-9]"

выдаст

rename_me01.txt
rename_me02.txt
rename_me03.txt
rename_me04.txt

ОК, не очень хороший пример, потому что вы можете сделать это с помощью старого доброго ? подстановочного знака. Я хочу сказать, что шаблон для findstr является регулярным выражением.

Недавно у меня была похожая проблема, но мне было скучно пытаться выяснить, как заменить шаблоны регулярных выражений. Я не уверен, возможно ли это, используя только собственные команды Windows. Итак, для более простого, но все же нативного решения я сослался на Windows Scripting Host . Моей задачей было найти все файлы с именами в формате dd.mm.yyyy и заменить эту дату на текущую.

Сценарий для этого:

<job>
    <script language="JavaScript">
        var d = new Date();
        // get current date for replacement
        var currDate = (d.getDate() + "." + (d.getMonth() + 1) + "." + d.getFullYear())
            // add leading zeros to date and month
            .replace(/^([0-9])\./g, '0$1.').replace(/\.([0-9])\./g, '.0$1.');
        var fso = new ActiveXObject("Scripting.FileSystemObject");  
        var files = new Enumerator(fso.getFolder(".").files);
        var count = 0;
        for (; !files.atEnd(); files.moveNext())
        {
            var file = ""+files.item(); // make it string
            if (file.match(/[0-9]{2}\.[0-9]{2}\.[0-9]{4}/)) {
                var newName = file.replace(/[0-9]{2}\.[0-9]{2}\.[0-9]{4}/, currDate);
                fso.moveFile(file, newName);
                count++;
            }
        }
        WScript.echo("Renamed "+count+" files");
    </script>
</job>

Сохранено под именем u.wsf и помещено в папку с этими файлами. Расширение связано с wscript, поэтому при двойном щелчке по файлу оно запускается в режиме графического интерфейса, но также может работать в режиме командной строки:

cscript u.wsf
0 голосов
/ 03 сентября 2011

Стандартными инструментами в Unix для этого являются sed и Perl. Есть порты DOS / Windows обоих.

A:\> sed -i "s/foo/bar/g" file1 file2 file3

A:\> perl -pi -e "s/foo/bar/g" file1 file2 file3

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...