बैश में अशक्त-सीमांकित इनपुट पर `हेड` और` टेल` कैसे करें?


18

findकमांड एक नल-सीमांकित स्ट्रिंग्स (यदि -print0प्रदान की गई है) के रूप में फाइलों के नाम आउटपुट xargsकर सकती है , और -0चालू किए गए विकल्प के साथ उनका उपभोग कर सकती है । लेकिन बीच में, यह फ़ाइलों की है कि संग्रह में हेरफेर करने के मुश्किल है - sortआदेश है -zस्विच, यह संभव उन फ़ाइलों को सॉर्ट करने के लिए करता है कि है, लेकिन headऔर tailउन्हें जरूरत नहीं है।

मैं एक सुविधाजनक तरीके से उन अशक्त सीमांत इनपुट्स पर headऔर कैसे कर सकता हूं tail? (मैं हमेशा एक छोटी और धीमी रूबी स्क्रिप्ट बना सकता हूं, लेकिन मुझे आशा है कि बेहतर तरीका हो सकता है)

जवाबों:


21

GNU headऔर tailCoreutils संस्करण 8.25 के बाद से इसके लिए एक -zविकल्प है।

पुराने संस्करणों के साथ या गैर जीएनयू प्रणालियों के लिए, आप कोशिश करते हैं और स्वैप कर सकते हैं \0और \n:

find ... -print0 |
  tr '\0\n' '\n\0' |
  head |
  tr '\0\n' '\n\0'

ध्यान दें कि कुछ headकार्यान्वयन NUL वर्णों के साथ सामना नहीं कर सकते हैं (और वे POSIX द्वारा आवश्यक नहीं हैं), लेकिन जहां समर्थन पाते हैं -print0, headऔर पाठ उपयोगिताओं आमतौर पर NUL वर्णों का समर्थन करते हैं।

आप दोनों trs के बीच किसी भी कमांड को लपेटने के लिए एक फंक्शन का उपयोग कर सकते हैं :

nul_terminated() {
  tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}

find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...

ध्यान में रखें कि nul_terminated, का \0अर्थ है एक नई लाइन वर्ण। उदाहरण के लिए, इसके \nसाथ प्रतिस्थापित करने के लिए _:

find . -depth -name $'*\n*' -print0 | nul_terminated sed '
  p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv

( \x0जीएनयू विस्तार भी किया जा रहा है)।

यदि आपको एक से अधिक फ़िल्टरिंग कमांड चलाने की आवश्यकता है , तो आप कर सकते हैं:

find ... -print0 |
  nul_terminated cmd1 |
  nul_terminated cmd2 | xargs -r0 ...

लेकिन इसका मतलब है कि कुछ निरर्थक trआदेशों को चलाना । वैकल्पिक रूप से, आप चला सकते हैं:

find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...

2
क्या यह मानों के परिसीमन के \x0बजाय उपयोग करने के लिए प्राथमिक \nकारण नहीं है? () ताकि आप उन मूल्यों का सामना कर सकें जो इसमें शामिल हो सकते हैं \n)
थिवर्डवर्ड

@ इसके विपरीत, नहीं, इसके विपरीत -print0 | tr '\n\0' '\0\n'में उन फ़ाइल पथों का प्रतिनिधित्व करने वाली लाइनें हैं, जहाँ पर उन में नए अक्षरों को परिवर्तित किया गया है \0। इसलिए, यदि आप पहली पंक्ति के साथ ले जाते हैं head -n 1और फिर से \0एस को फिर से नई लाइनों में परिवर्तित करते हैं tr '\0\n' '\n\0', तो आपको पहला फाइल पथ एनयूएल-सीमांकित होता है जिसमें इसके एम्बेडेड न्यूलाइन वर्ण होते हैं।
स्टीफन चेज़लस 22
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.