我正在使用shell,试图在一堆CSV文件中找到NUL字符(Python的CSV导入器正在喋喋不休,但那是另一次)使用我这么自豪的聪明人-self:
find ~/path/ -name "*.csv" -print0 | \
xargs -n 1 -0 \
perl -ne 'if(m/\x{00}/){print fileno(ARGV).join(" ",@ARGV).$_;}'
除了我看不到文件名。 据称隐含的<> perl -ne
正在包装我的脚本的运算符只是使用@ARGV
/ ARGV
文件句柄,但上述两个都没有给我当前文件的名称。
如何查看上面的当前文件名(以及理想情况下的行号)?
答案 0 :(得分:10)
$ARGV
是当前文件的名称,$.
是当前行号;请参阅perldoc perlvar
中的perldoc perlop
和 I / O操作员。 (请注意,$.
不会在文件之间重置;在perldoc -f eof
中会对此进行讨论。)
我并不完全确定你要用print
完成什么。它会给你一个文件句号,大概是3,前面是一个以空格分隔的文件名列表(可能只是因为xargs -n
的那个),然后是当前行,它将包含{{1和其他潜在的终端混淆字符。
答案 1 :(得分: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/'