4

我在 shell 中工作,试图在一堆 CSV 文件中找到 NUL 字符(Python 的 CSV 导入器正在考虑,但那是另一次了)使用我如此自豪的我永远聪明的自我:

find ~/path/ -name "*.csv" -print0 | \
xargs -n 1 -0 \
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}'

除了我看不到文件名。据称,包含我的脚本的隐式 <> 运算符perl -ne只是使用@ARGV/ARGV文件句柄,但以上都没有给我当前文件的名称。

我如何在上面看到当前文件名(理想情况下是行号)?

4

2 回答 2

10

$ARGV是当前文件名,$.是当前行号;请参阅中的perldoc perlvarI/O 运算perldoc perlop。(请注意,$.不会在文件之间重置;在 中对此进行了讨论perldoc -f eof。)

而且我不完全确定您要通过它来完成什么print;它将为您提供文件句柄编号,可能是 3,添加到以空格分隔的文件名列表(这可能只是一个,因为xargs -n),然后是当前行,其中将包含NUL和其他潜在的终端混淆字符。

于 2011-05-04T23:25:31.620 回答
0

Pproceed 这样的事情(我在这里搜索 .pl 文件中的“x”):

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -we 'while (<>) { print qq($ARGV\t$.\t$_) if m/x/ }'

是的,可以使用-n开关缩短它:

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'
于 2011-05-04T23:40:23.403 回答