Domanda

Sto lavorando nella shell, cercando di trovare caratteri NUL in un mucchio di file CSV (di cui si lamenta l'importatore CSV di Python, ma è per un'altra volta) usando il così orgoglioso-del-mio-sempre-intelligente-self:

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

Tranne che non vedo il nome del file. Presumibilmente l'operatore <> implicito in cui perl -ne sta avvolgendo il mio script sta semplicemente usando @ARGV / il filehandle ARGV, ma nessuno dei precedenti mi fornisce il nome del file corrente.

Come vedo il nome del file corrente (e, idealmente, il numero di riga) sopra?

È stato utile?

Soluzione

$ARGV è il nome del file corrente e $. è il numero di riga corrente;vedere perldoc perlvar e Operatori di I / O in perldoc perlop.(Nota che $. non si ripristina tra i file; c'è una discussione su questo in perldoc -f eof.)

E non sono del tutto sicuro di cosa stai cercando di ottenere con quel print;ti darà il numero del filehandle, che probabilmente è 3, anteposto a un elenco di nomi di file separati da spazi (che probabilmente dovrebbe essere solo quello a causa di xargs -n), quindi la riga corrente che includerà il NUL e altri potenzialmente confusi dal terminalecaratteri.

Altri suggerimenti

Procedi in questo modo (ho cercato "x" nei file .pl):

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

E sì, può essere abbreviato utilizzando l'opzione -n:

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top