Frage

Ich arbeite in der Shell und versuche, NUL-Zeichen in einer Reihe von CSV-Dateien zu finden (über die der CSV-Importer von Python schwärmt, aber das ist ein anderes Mal), indem ich den so Stolz auf meine immer clevere verwende-selbst:

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

Außer ich sehe keinen Dateinamen. Angeblich verwendet der implizite <> Operator, in den perl -ne mein Skript einwickelt, nur @ARGV / das ARGV-Dateihandle, aber keiner der oben genannten Operatoren gibt mir den Namen der aktuellen Datei.

Wie sehe ich den aktuellen Dateinamen (und im Idealfall die Zeilennummer) oben?

War es hilfreich?

Lösung

$ARGV ist der Name der aktuellen Datei und $. ist die aktuelle Zeilennummer.Siehe perldoc perlvar und E / A-Operatoren im perldoc perlop.(Beachten Sie, dass der $. zwischen den Dateien nicht zurückgesetzt wird. Dies wird im perldoc -f eof diskutiert.)

Und ich bin mir nicht ganz sicher, was Sie mit diesem print erreichen wollen.Sie erhalten die Dateihandle-Nummer, die wahrscheinlich 3 ist, vor einer durch Leerzeichen getrennten Liste von Dateinamen (die aufgrund des xargs -n wahrscheinlich nur diejenige sein sollten) und dann die aktuelle Zeile, die den NUL und andere möglicherweise terminal verwirrende Elemente enthältZeichen.

Andere Tipps

Fahren Sie so fort (ich habe hier in .pl-Dateien nach "x" gesucht):

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

Und ja, es kann mit dem -n-Schalter gekürzt werden:

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top