find:在perl脚本中缺少`-exec'的参数

时间:2011-12-29 22:42:49

标签: perl shell sed replace

我知道有很多问题与我的小问题相似。一些由第二个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,我就会收到错误。

逃脱角色有问题吗? 我错过了什么? (请原谅我的英文)

4 个答案:

答案 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

由于您启用了strictwarnings,因此您也应该看到上面给出的类似警告。

更重要的是,如果您的脚本包含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' {} +");