Question

Je travaille dans le shell, essayant de trouver NUL Chars dans un tas de fichiers CSV (que l'importateur CSV de Python se réjouit, mais c'est pour une autre fois) en utilisant le 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).$_;}'

Sauf que je ne vois aucun nom de fichier. Prétendument l'opérateur implicite <> perl -ne Emballage mon script est juste en utilisant @ARGV / la ARGV FileHandle, mais aucun des éléments ci-dessus ne me donne le nom du fichier actuel.

Comment voir le nom de fichier actuel (et, idéalement, le numéro de ligne) ci-dessus?

Était-ce utile?

La solution

$ARGV est le nom du fichier actuel et $. est le numéro de ligne actuel; voir perldoc perlvar et Opérateurs d'E / S dans perldoc perlop. (Notez que $. ne réinitialise pas les fichiers; il y a une discussion à ce sujet dans perldoc -f eof.)

Et je ne suis pas tout à fait sûr de ce que vous essayez d'accomplir avec ça print; Il vous donnera le numéro de filehandle, qui est probablement 3, apparenté à une liste de noms de fichiers séparés par l'espace (qui ne devrait probablement être que celui à cause de xargs -n), puis la ligne actuelle qui comprendra le NUL et d'autres caractères potentiellement terminaux.

Autres conseils

Pproceeple quelque chose comme ça (j'ai recherché des fichiers .pl pour "x" ici):

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

Et oui, il peut être raccourci en utilisant le -n changer:

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top