Pregunta

Estoy trabajando en el shell, tratando de encontrar caracteres NUL en un montón de archivos CSV (de los que se queja el importador CSV de Python, pero eso es para otro momento) usando el tan-orgulloso-de-mi-siempre-inteligente-yo:

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

Excepto que no veo ningún nombre de archivo. Presuntamente el operador <> implícito que perl -ne está envolviendo mi script, solo está usando @ARGV / el ARGV filehandle, pero ninguno de los anteriores me da el nombre del archivo actual.

¿Cómo veo el nombre del archivo actual (y, idealmente, el número de línea) en lo anterior?

¿Fue útil?

Solución

$ARGV es el nombre del archivo actual y $. es el número de línea actual;ver perldoc perlvar y Operadores de E/S en perldoc perlop.(Tenga en cuenta que $. no se reinicia entre archivos;hay una discusión sobre eso en perldoc -f eof.)

Y no estoy del todo seguro de qué estás tratando de lograr con eso. print;le dará el número de identificador de archivo, que probablemente sea 3, antepuesto a una lista de nombres de archivos separados por espacios (que probablemente debería ser solo uno debido a xargs -n), luego la línea actual que incluirá el NUL y otros caracteres potencialmente confusos para el terminal.

Otros consejos

Proceda con algo como esto (busqué "x" en los archivos .pl aquí):

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

Y sí, se puede acortar usando el conmutador -n:

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top