我正在尝试将find命令的输出输送到perl一行,以将以?>结尾的行替换为RedefineForDocker::standardizeXmlmc(),但出于某种原因,该值没有被替换。我已经检查了find命令的输出,它正在按预期执行,我已经双倍地检查了regex,它应该匹配。
find . -name *.php -exec ggrep -Ezl 'class XmlMethodCall.*([?]>)$' {} \; \
| xargs perl -ewpn -i.bak2 \
"s/[?]>\s*?$/RedefineForDocker::standardizeXmlmc()\n/gm"我没有收到警告,也没有迹象表明它不工作,备份是创建的,但是文件保持不变。从find命令运行的匹配文件列表如下。
./swsupport/clisupp/trending/services/data.helpers.php
./swsupport/clisupp/_bpmui/arch/service/data.helpers.php
./swsupport/clisupp/_bpmui/itsm/service/data.helpers.php
./swsupport/clisupp/_bpmui/itsm_default/service/data.helpers.php
./webclient_code/php/session.php
./webclient_code/service/storedquery/helpers.php
./php/_phpinclude/itsm/xmlmc/xmlmc.php
./php/_phpinclude/itsmf/xmlmc/xmlmc.php
./php/_phpinclude/itsm_default/xmlmc/xmlmc.php下面是它应该匹配的一个文件的示例
发布于 2019-08-09 16:59:45
运行您的perl命令如下:
perl -i.bak2 -wpe 's/\?>\h*$/RedefineForDocker::standardizeXmlmc()\n/gm'命令行顺序选项在这里很重要。
完整的管道应该是这样的:
find . -name '*.php' -exec ggrep -PZzl '(?ms)class XmlMethodCall.*\?>\h*$' {} + |
xargs -0 perl -i.bak2 -wpe 's/\?>\h*$/RedefineForDocker::standardizeXmlmc()\n/gm'注意:在-Z中使用grep选项,在xargs中使用-0选项来解决文件名与空格等相关的问题。
https://stackoverflow.com/questions/57434199
复制相似问题