批量正则表达式搜索替换

3

我希望能够使用正则表达式在 Windows 批处理文件中对一组文件进行搜索和替换。大致如下:

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

另外,我需要在正则表达式中添加一个变量来替换值。有人知道如何处理批处理脚本吗?我对此并不是很熟悉,一些示例可能会有所帮助。

2个回答

2

您可以受益于 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脚本宿主。我的任务是查找所有文件名中日期格式为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相关联,因此双击该文件时会在GUI模式下运行,但也可以在命令行模式下运行:

cscript u.wsf

0

在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

将在指定的文件中用"bar"替换"foo"。Sed比较老,-i选项也没有标准化,而Perl更加灵活,是一种完整的编程语言,其正则表达式功能集也更好,但对于简单的一次性任务,两者都可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接