इसलिए, सामान्य तौर पर, मैं sedटेक्स्ट प्रोसेसिंग के लिए - विशेष रूप से बड़ी फ़ाइलों के लिए - और आमतौर पर शेल में ही उन प्रकार की चीजों को करने से बचता हूं ।
मुझे लगता है, हालांकि, यह बदल सकता है। मैं चारों ओर घूर रहा था man kshऔर मैंने इस पर ध्यान दिया:
<#pattern Seeks forward to the beginning of the
next line containing pattern.
<##pattern The same as <# except that the por‐
tion of the file that is skipped is
copied to standard output.
वास्तविक दुनिया की उपयोगिता पर संदेह करते हुए, मैंने इसे आजमाने का फैसला किया। मैंने किया:
seq -s'foo bar
' 1000000 >file
... डेटा की एक लाख पंक्तियों के लिए जो दिखती हैं:
1foo bar
...
999999foo bar
1000000
... और इस sedतरह के खिलाफ खड़ा है :
p='^[^0-8]99999.*bar'
for c in "sed '/$p/q'" "ksh -c ':<##@(~(E)$p)'"
do </tmp/file eval "time ( $c )"
done | wc -l
इसलिए दोनों कमांड को 999999foo बार तक जाना चाहिए और ऐसा करने के लिए उनके पैटर्न मिलान कार्यान्वयन को कम से कम प्रत्येक पंक्ति की शुरुआत और अंत का मूल्यांकन करना चाहिए। उन्हें एक नकारात्मक पैटर्न के खिलाफ पहले चार को सत्यापित करना होगा। यह एक साधारण बात है, लेकिन ... परिणाम वे नहीं थे जिनकी मुझे उम्मीद थी:
( sed '/^[^0-8]99999.*bar/q' ) \
0.40s user 0.01s system 99% cpu 0.419 total
( ksh -c ':<##@(~(E)^[^0-8]99999.*bar)' ) \
0.02s user 0.01s system 91% cpu 0.033 total
1999997
kshयहाँ ERE और sedBRE का उपयोग करता है । मैंने kshपहले और शेल पैटर्न के साथ एक ही काम किया था लेकिन परिणाम अलग नहीं थे।
वैसे भी, यह एक काफी महत्वपूर्ण विसंगति है - 10 बार kshओवरपरफॉर्म sed। मैंने पहले पढ़ा है कि डेविड कॉर्न ने अपना io एफबीआई लिखा था और इसे लागू करता है ksh- संभवतः यह संबंधित है? - लेकिन मैं इसके बारे में कुछ नहीं के बगल में जानता हूं। यह कैसा है शेल यह इतनी अच्छी तरह से करता है?
मेरे लिए और भी आश्चर्यजनक बात यह है कि kshवास्तव में इसकी ऑफसेट वहीं छोड़ती है जहाँ आप इसे पूछते हैं। प्राप्त करने के लिए (लगभग) का एक ही बाहर (जीएनयू) sed आप का उपयोग करने के लिए है -u- बहुत धीमी गति से ।
यहाँ एक grepवी। kshपरीक्षण है:
1000000 #grep + head
( grep -qm1 '^[^0-8]99999.*bar'; head -n1; ) \
0.02s user 0.00s system 90% cpu 0.026 total
999999foo bar #ksh + head
( ksh -c ':<#@(~(E)^[^0-8]99999.*bar)'; head -n1; ) \
0.02s user 0.00s system 73% cpu 0.023 total
kshgrepयहाँ धड़कता है - लेकिन यह हमेशा नहीं होता है - वे बहुत ज्यादा बंधे होते हैं। फिर भी, यह बहुत उत्कृष्ट है, और ksh लुकहेड प्रदान करता है - इसके मैच से पहलेhead इनपुट शुरू होता है ।
यह सिर्फ सच होने के लिए बहुत अच्छा लगता है, मुझे लगता है। हुड के तहत ये कमांड अलग-अलग क्या कर रहे हैं?
ओह, और जाहिरा तौर पर यहाँ भी एक उपसमूह नहीं है:
ksh -c 'printf %.5s "${<file;}"'
patternरेगुलर एक्सप्रेशन या एक सरल खोल पैटर्न?