Pergunta

Estou trabalhando no shell, tentando encontrar NUL chars em um monte de arquivos CSV (que o importador CSV do Python está reclamando, mas isso é para outra hora) usando o tão-orgulho-de-meu-sempre-inteligente-se:

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

Exceto que não vejo o nome do arquivo. Supostamente o operador <> implícito no qual perl -ne está envolvendo meu script está apenas usando @ARGV / o ARGV filehandle, mas nenhum dos itens acima está me fornecendo o nome do arquivo atual.

Como posso ver o nome do arquivo atual (e, de preferência, o número da linha) acima?

Foi útil?

Solução

$ARGV é o nome do arquivo atual e $. é o número da linha atual;consulte perldoc perlvar e Operadores de E / S em perldoc perlop.(Observe que $. não redefine entre os arquivos; há uma discussão sobre isso em perldoc -f eof.)

E não tenho certeza do que você está tentando realizar com esse print;ele lhe dará o número do identificador de arquivo, que provavelmente é 3, anexado a uma lista de nomes de arquivos separados por espaço (que provavelmente deve ser apenas um por causa de xargs -n), a linha atual que incluirá o NUL e outros potencialmente confusospersonagens.

Outras dicas

Proceda a algo assim (pesquisei "x" em arquivos .pl aqui):

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

E sim, ele pode ser reduzido usando a opção -n:

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top