我希望能够使用正则表达式在 Windows 批处理文件中对一组文件进行搜索和替换。大致如下:
if the regex matches a line matches then replace it with a new line.
另外,我需要在正则表达式中添加一个变量来替换值。有人知道如何处理批处理脚本吗?我对此并不是很熟悉,一些示例可能会有所帮助。
我希望能够使用正则表达式在 Windows 批处理文件中对一组文件进行搜索和替换。大致如下:
if the regex matches a line matches then replace it with a new line.
另外,我需要在正则表达式中添加一个变量来替换值。有人知道如何处理批处理脚本吗?我对此并不是很熟悉,一些示例可能会有所帮助。
您可以受益于 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
在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更加灵活,是一种完整的编程语言,其正则表达式功能集也更好,但对于简单的一次性任务,两者都可以。