find/xargs/perl -ne 的当前文件名?

发布于 2024-11-05 10:19:04 字数 424 浏览 1 评论 0原文

我正在 shell 中工作,尝试使用 so-proud-of-my-ever-clever-self 在一堆 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 文件句柄,但以上都没有给我当前文件的名称。

如何查看上面的当前文件名(最好是行号)?

I'm working in the shell, trying to find NUL chars in a bunch of CSV files (that Python's CSV importer is whinging about, but that's for another time) using the so-proud-of-my-ever-clever-self:

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

Except I see no filename. Allegedly the implicit <> operator that perl -ne is wrapping my script in is just using @ARGV / the ARGV filehandle, but neither of the above is giving me the name of the current file.

How do I see the current filename (and, ideally, line number) in the above?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沫雨熙 2024-11-12 10:19:04

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

而且我不完全确定您想要什么用 print 完成;它会给你文件句柄号,可能是 3,前面是一个以空格分隔的文件名列表(由于 xargs -n ,这可能应该是唯一的一个),然后是当前行包括 NUL 和其他可能导致终端混淆的字符。

$ARGV is the name of the current file and $. is the current line number; see perldoc perlvar and I/O Operators in perldoc perlop. (Note that $. doesn't reset between files; there's discussion of that in perldoc -f eof.)

And I'm not entirely sure what you're trying to accomplish with that print; it will give you the filehandle number, which is probably 3, prepended to a space-separated list of filenames (which should probably be only the one because of xargs -n), then the current line which will include the NUL and other potentially terminal-confusing characters.

意中人 2024-11-12 10:19:04

进行类似这样的操作(我在此处搜索了 .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/'

Pproceed something like this (I searched .pl files for "x" here):

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

And yes, it can be shortened using the -n switch:

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文