1

我正在执行 perl -pe 和 grep 来执行多行 grep。这样做是为了当“”用作行继续字母时,我需要加入该行。

所以我的文件是

record -field X \
   -field Y

我在做

perl -pe 's/\\\n/ /' a/b/c/*/records/*.rec | grep "\-field.*X.*\-field.*Y"

问题在于它只是给了我 grep 结果,而没有告诉我哪个文件有问题。有没有解决的办法。我需要知道哪些文件也有这个。

我可以做一个 foreach shell 脚本,但想知道是否有相同可能性的一个衬里版本

4

2 回答 2

3

一旦你进入 Perl 程序,为什么要进入系统grep?Perl 的工具比 shell 的要丰富、全面和实用得多。单程

perl -0777 -nE'say "$ARGV: $_" for 
    grep { /\-field.*X.*\-field.*Y/ } split /\n/, s{\\\n}{ }gr' file-list

(为了便于阅读,分成几行)

我们将整个文件读入$_(“slurp”它),以便能够使用-0777switch合并这些特定的行。然后\\n将其替换为空格并返回结果字符串(通过/r修饰符),并split通过\n重新生成行。

然后将该行列表与您所需的模式一起馈送到grep中,并传递与该模式匹配的行。然后它们被打印出来,前面加上当前处理的文件的名称,在$ARGV变量中可用。

于 2021-08-19T01:41:23.310 回答
-1

答案是使用 ARGV[0]

perl -pe 'print "$ARGV[0]: ";s/\\\n/ /' a/b/c/*/records/*.rec | grep "\-field.*X.*\-field.*Y"
于 2021-08-19T00:40:47.203 回答