سؤال

أنا أعمل في الصدفة، وأحاول العثور على أحرف NUL في مجموعة من ملفات CSV (التي يتذمر منها مستورد Python CSV، ولكن هذا لوقت آخر) باستخدام ما أفتخر به من ذاتي الذكية:

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

إلا أنني لا أرى أي اسم الملف. يزعم عامل التشغيل <> الضمني ذلك perl -ne يتم تغليف البرنامج النصي الخاص بي باستخدام فقط @ARGV / ال ARGV filehandle، ولكن لا شيء مما سبق يعطيني اسم الملف الحالي.

كيف يمكنني رؤية اسم الملف الحالي (ورقم السطر بشكل مثالي) في ما سبق؟

هل كانت مفيدة؟

المحلول

$ARGV هو اسم الملف الحالي و $. هو رقم السطر الحالي؛يرى perldoc perlvar و مشغلي الإدخال/الإخراج في perldoc perlop.(لاحظ أن $. لا يتم إعادة التعيين بين الملفات؛هناك مناقشة لذلك في perldoc -f eof.)

ولست متأكدًا تمامًا مما تحاول تحقيقه من خلال ذلك print;سيعطيك رقم مقبض الملف، والذي من المحتمل أن يكون 3، مُلحقًا بقائمة أسماء الملفات المفصولة بمسافات (والتي من المحتمل أن تكون الرقم الوحيد بسبب xargs -n)، ثم السطر الحالي الذي سيتضمن NUL وغيرها من الشخصيات التي قد تكون مربكة للطرفية.

نصائح أخرى

تابع شيئًا كهذا (لقد بحثت في ملفات .pl عن "x" هنا):

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/'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top