我知道有很多问题与我的小问题相似。一些由第二个exec修复,但这不是我需要的。也许我只是没有看到我的问题在哪里......
我想在我的博客分析输出中匿名化html文件中的所有IP:
#!/usr/bin/perl
use warnings;
use strict;
use readPathsFromConf;
system ("find $readPathsFromConf::WWWPATH$readPathsFromConf::WWWSUBDIR -type f -name \"\*\" -exec sed -i '' 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/anonymisiert/g' \{\} \;");
我只得到
find: missing argument to `-exec'
当我在命令行输入时,我在STDOUT上获得了正确的文件:
find /var/www/statistics/ -type f -name "*"
但是一旦我添加了exec-part,我就会收到错误。
逃脱角色有问题吗? 我错过了什么? (请原谅我的英文)
答案 0 :(得分:3)
你应该转义嵌入在字符串中的引号和反斜杠:
system ("find /var/www/statistics/ -type f -name \"*\" -exec sed -i 's/\\([0-9]\\{1,3\\}\\.\\)\\{3\\}[0-9]\\{1,3\\}/anonymousIP/g' {} \\;");
另请注意,在某些平台(例如Mac OS X)上,sed的-i
选项需要参数 - 备份文件扩展名。
答案 1 :(得分:3)
Perl有一个非常好的File::Find核心模块。无需调用外部实用程序即可使用查找。
甚至还有一个名为 find2perl 的辅助脚本,它可以帮助您从使用shell的find到Perl的桥接。这将在上面的链接中讨论。
答案 2 :(得分:1)
因为在:
system ("find /var/www/statistics/ -type f -name "*" -exec sed -i 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/anonymousIP/g' {} \;");
星号周围的双引号不会被转义。因此,解释器认为你是两个东西相乘,并会自动将每个字符串转换为0
(顺便说一句,这也是你在Perl中不使用==
进行字符串比较的原因)。
例如,单行
perl -e 'use strict;use warnings;my $a="abc";my $b="def";my $c=$a*$b;print "$c\n";'
产生输出
Argument "def" isn't numeric in multiplication (*) at -e line 1.
Argument "abc" isn't numeric in multiplication (*) at -e line 1.
0
由于您启用了strict
和warnings
,因此您也应该看到上面给出的类似警告。
更重要的是,如果您的脚本包含system
调用,为什么不直接在命令行上运行参数system
?
答案 3 :(得分:1)
这应该有效 -
#!/usr/bin/perl
use warnings;
use strict;
system ("find /var/www/statistics/ -type f -name \"*\" -exec sed -i 's/\\([0-9]\\{1,3\\}\\.\\)\\{3\\}[0-9]\\{1,3\\}/anonymousIP/g' {} +");