【发布时间】:2017-01-10 18:36:26
【问题描述】:
我是 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:如果重要的话,我在 Windows 上的 Ubuntu 上使用 Bash
this 可以关联吗?
【问题讨论】: