wc -L एक टैब-चार के लिए 8-पंक्ति की लंबाई की रिपोर्ट करता है। बग या सुविधा?


12

-Lकी एक उपयोगी विशेषता है wc, या इसलिए मैंने सोचा। यह सबसे लंबी लाइन की लंबाई को प्रिंट करता है। किसी कारण से यह 8. की लंबाई तक सिंगल-बाइट टैब-चार का विस्तार करता है।
क्या टैब को "विस्तारित" नहीं करने के लिए इसे सेट करने का कोई तरीका है? और इस विस्तार के पीछे तर्क क्या हो सकता है?

echo -n $'\t' | wc -L

आउटपुट 8

wc (GNU coreutils) 7.4
GNU बैश, संस्करण 4.1.5


प्रश्न के लिए एन-ऑर्थोगोनल है।
उपयोगकर्ता अज्ञात

जवाबों:


11

मुझे इससे संबंधित कोई बग रिपोर्ट और स्रोत फ़ाइल में निम्न पंक्तियाँ नहीं मिलीं wc.c

    case '\t':
        linepos += 8 - (linepos % 8);

इस तरह से व्यवहार करने के लिए जानबूझकर चुनें, शायद स्क्रीन पर फ़ाइल को प्रदर्शित करने के लिए आवश्यक चौड़ाई के लिए एक संकेत देना है।

एक त्वरित विकल्प हो सकता है

echo -n $'\t' | tr '\t' ' ' | wc -L

2
धन्यवाद enzo, मैं अब पाया है कि हालांकि man wcइस मुद्दे का कोई उल्लेख नहीं करता है, यह info coreutils 'wc invocation'(जो 'आदमी' भी संदर्भित करता है) में कहा गया है ... इसके अलावा, Google- क्षेत्र को थोड़ा और पीछे करने के बाद, मैंने इसे एक विकल्प के रूप में पाया echo -n $'\t' | expand -t1 | wc -L, जो आपके विकल्प के रूप में बहुत अधिक है, लेकिन मैंने इसे अच्छे उपाय के लिए फेंक दिया है .. और हालांकि निम्नलिखित लिंक एक recompile wc हैक * है , यह कुछ के लिए ब्याज की हो सकती है: विभिन्न टैब चौड़ाई के लिए wc समर्थन
पीटर।

1

आम तौर पर एक टैब को अगली स्थिति में विस्तारित किया जाता है, (8 से विभाज्य) +1 [1, 9, 17, 25, ...], इसलिए यदि आप इसके लिए पूछते हैं, तो आप इसे प्राप्त करते हैं।

ध्यान दें, कि -n प्रश्न के लिए अप्रासंगिक है, लेकिन $ नहीं है।

echo foo$'\t' | wc -L

8 भी लौटेंगे, क्योंकि

echo foo$'\t'bar 
foo     bar

आप $ का उपयोग कर सकते हैं, यदि आप इको का उपयोग करते हैं:

echo -e '\t' | wc -L
8

इसलिए यदि आप '\ t' को एक ही बाइट के रूप में गिनना चाहते हैं, तो बस छोड़ दें -e और $:

echo '\t' | wc -L
2

हाँ, टैब का विस्तार एक मुद्रित / प्रदर्शित किया उत्पादन के लिए आम के लिए पर्याप्त है, लेकिन मैं यह अजीब पाया गया कि एक प्रोग्राम है जो मायने रखता है बाइट्स और शब्दों में गिना जाएगा 1 के अलावा और कुछ के रूप में चरित्र 1 चरित्र ... btw echo '\t'नहीं करता उत्पादन टैब-चार (\ x09)। यह एक ऐसी लाइन को आउटपुट करता है जिसकी लंबाई 2 है, अर्थात। a '\'और a 't'। एक न्यूलाइन एक लाइन की लंबाई का हिस्सा नहीं है ... (मेरे पास -nयह देखने के लिए एक उदाहरण है कि wcक्या ठीक से एक फ़ाइल को संसाधित करना होगा जिसमें कोई
अनुवर्ती न्यूलाइन

wc --helpकहते हैं: -L, --max-line-length print the length of the longest line?। यह बाइट्स के बारे में बात नहीं करता है, लेकिन लाइन की लंबाई।
उपयोगकर्ता अज्ञात

1
हां, यह कहता है कि "सबसे लंबी लाइन की लंबाई प्रिंट करें" ... `लेकिन यह नहीं कहता है " हम मानते हैं कि आप टैब का विस्तार चाहते हैं (सामान्य वर्ण गणना नहीं, अधिकांश अन्य लंबाई के कार्यों की तरह) .. ओह, बाय। इस तरह, हम आपके विशिष्ट टैब स्टॉप के सेट पर ध्यान दिए बिना टैब के 8 स्थानों का विस्तार करेंगे। " ... वह जाल है .. यह ठीक से प्रलेखित नहीं है।
21

आप टैब को कैसे सेट करते हैं? बैश में? इसके अलावा: टैब 8 स्थानों तक विस्तारित नहीं हैं, लेकिन स्थिति के अनुसार, echo -e foo'\t'bar | wc -L11 में परिणाम देखें , 14. में नहीं
उपयोगकर्ता अज्ञात

इसके बाद के संस्करण में foo\tbarउदाहरण के लिए, wcहै ग्रहण की एक मामूली अंतर पर टैब-बंद हो जाता है 8 ... निम्न उदाहरण दिखाता है कि wcवर्तमान में सक्रिय टैब-ठहराव सेटिंग अनदेखी। यह टर्मिनल के लिए एक पंक्ति को आउटपुट करता है जो 8 टर्मिनल-कॉलम चौड़ा / लंबा है, फिर भी wcइसे 11. होने की रिपोर्ट करता है। यह उदाहरण हर 6 वें कॉलम के लिए टैब-स्टॉप सेट करता है ...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
पीटरऑ।

0

Wc -L विवरण अस्पष्ट था। यह व्यापक प्रदर्शन चौड़ाई लौटाता है। टैब विस्तार को नियंत्रित करने के लिए आप expandपहले के माध्यम से फ़िल्टर कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.