我是新手Perl脚本编写,但我需要做大量的正则表达式查找和替换跨越数百个文件。perl找到并替换删除文件
我遇到了this website,它推荐使用Perl命令perl -p -i -e 's/oldstring/newstring/g' *
来获取所有文件,然后perl -p -i -e 's/oldstring/newstring/g' 'find ./ -name *.html\'
将其过滤到某些文件。
我的目标是找到所有* .csproj和* .vbproj文件,并将对.dll的引用替换为新路径。
这些都是XML文件类型。
我替换文本是
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
与
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
<HintPath>..\..\..\..\ExternalDLLs\log4net.dll</HintPath>
</Reference>
我的命令到目前为止
perl -p -i -e 's/<Reference Include="log4net, (?:.*?[\t\s\n\r])*?<\/Reference>/<Reference Include="log4net, Version=1\.2\.10\.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL"><SpecificVersion>False<\/SpecificVersion><Private>True<\/Private><HintPath>\.\.\\\.\.\\\.\.\\\.\.\\ExternalDLLs\\log4net\.dll<\/HintPath><\/Reference>/g' `find . -type f \(-name "*.vbproj" -or -name "*.csproj" \)`
这似乎尝试和工作,但它只是最后删除我的所有* .vbproj和* .csproj文件。
我找不出为什么我的脚本正在删除文件。
任何帮助?
编辑:它打印了这一点每个文件
Can't do inplace edit on ./Middletier/TDevAccess/AmCad.Components.TDevAccess.csproj: No such file or directory.
编辑2:IM使用bash在Ubuntu在Windows上,如果该事项
能this有关?
我还没有运行过这个功能,但是从快速浏览看来,它看起来像是在查找一个XML标签'Reference',并添加了子项'HintPath'和'Private',是否正确?如果是这样,我该如何限制它以查找具有设置为特定值的属性的标签? –
即:具有'Include =“log4net,版本= 1.2.10.0 ...' –
的'Reference'标记足够容易,忍受着我,我会更新这个例子http://xmltwig.org/xmltwig/quick_ref html的 – Sobrique