4

私はシェルで作業していて、たくさんの CSV ファイルで NUL 文字を見つけようとしています (Python の CSV インポーターがうそをついていますが、それは別の機会にします)。

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

ファイル名が表示されないことを除いて。私のスクリプトをラップしている暗黙の <> 演算子は / ファイルハンドルを使用しているだけです、上記のどちらも現在のファイルの名前を教えてくれません。perl -ne@ARGVARGV

上記の現在のファイル名 (および理想的には行番号) を確認するにはどうすればよいですか?

4

2 に答える 2

10

$ARGVは現在のファイルの名前であり、$.は現在の行番号です。perldoc perlvarのおよびI/O演算子を参照してくださいperldoc perlop$.(ファイル間でリセットされないことに注意してください。これについては、で説明していperldoc -f eofます。)

そして、私はあなたがそれで何を達成しようとしているのか完全にはわかりませんprint; ファイルハンドル番号(おそらく3)が、スペースで区切られたファイル名のリスト(おそらく、のために1つだけである必要があります)の前に追加されxargs -n、現在の行には、NULおよびその他の端末を混乱させる可能性のある文字が含まれます。

于 2011-05-04T23:25:31.620 に答える
0

次のように進めます(ここで「x」の.plファイルを検索しました):

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

はい、-nスイッチを使用して短縮できます。

find -type f -name \*.pl -print0 | \
xargs -0 \
perl -nwe 'print qq($ARGV\t$.\t$_) if m/x/'
于 2011-05-04T23:40:23.403 に答える