2011-08-30 13 views
11

मैं उत्पादन का उत्पादन करने के लिए grep का उपयोग कर रहा हूं जिसे किसी अन्य प्रोग्राम द्वारा पार्स किया जाएगा।grep को पिछली नई लाइन प्रिंट करने से कैसे रोकें?

हालांकि, वह प्रोग्राम केवल आउटपुट या शून्य-बाइट्स होने की अपेक्षा करता है।

अब grep इसके आउटपुट के बाद एक न्यूलाइन चरित्र आउटपुट करता है। मैंने -Z विकल्प की जांच की है लेकिन यह काम नहीं कर रहा है क्योंकि मैं गिनती (-c) के लिए grep का उपयोग कर रहा हूं।

मैं sh में निष्पादित कर रहा हूं, bash नहीं। तो इसे echo -n "$(grep -c pattern)" में घोंसला करना या तो काम नहीं करता है।

मैं पिछली नई लाइन से कैसे छुटकारा पा सकता हूं?

उत्तर

14

आप इसे tr के माध्यम से पाइप कर सकते हैं और \ n को \ 0 वर्ण में अनुवाद कर सकते हैं।

+0

यह काम किया! धन्यवाद! जब यह मुझे देता है तो स्वीकार करेगा; पी –

18

उपयोग tr -d एक स्ट्रिंग में वर्णों को हटाने के लिए:

sh-3.2$ grep -c ' ' /etc/passwd | tr -d '\n' 
69sh-3.2$ grep -c ' ' /etc/passwd | tr -d '\n' | xxd 
0000000: 3639          69 
sh-3.2$ 
+0

tr gdb के बिना '4 \ nj \ 000 \ 000' दिखाता है, tr के साथ यह कमांड लाइन से वापस आने के मूल्य के रूप में' 4 \ 346j \ 000 \ 000' दिखाता है। 4 गिनती संख्या है जो मैं चाहता हूं। –

+0

क्या आप वाकई 'grep' संख्या के बाद उन पात्रों का उत्पादन कर रहे हैं? – Johnsyweb

8

मैं जानता हूँ कि यह पुराना है, और टीआर तरह ही काम करता है, लेकिन मैं इस सवाल के पार हुआ और पाया है ओ पी ने कहा: मैं में क्रियान्वित कर रहा हूँ श, बाश नहीं। तो इसे echo -n "$ (grep -c पैटर्न) में घोंसला करना या तो काम नहीं करता है।

यह grep या sh इतना नहीं है कि echo का उपयोग कैसे किया जा रहा है। भविष्य के आगंतुकों के लिए, एकमात्र कारण यह काम नहीं करता है, प्रतिस्थापित आदेश के चारों ओर डबल कोट्स के कारण है। निम्नलिखित में, वास्तव में, sh का उपयोग करके भी काम करता है।

echo -n $(grep -c pattern) 

उदाहरण:

$ ls /dev/sd? #example of formatted output 
/dev/sda /dev/sdc /dev/sde /dev/sdg /dev/sdi /dev/sdk 
/dev/sdb /dev/sdd /dev/sdf /dev/sdh /dev/sdj 

$ echo $(ls /dev/sd?) #without -n, appends \n only at the end 
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk 

$ echo -n $(ls /dev/sd?) #with -n, does not append the \n, but still strips the line breaks from the string 
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk 

$ echo -n "$(ls /dev/sd?)" #output when double quotes are used 
/dev/sda 
/dev/sdb 
/dev/sdc 
/dev/sdd 
/dev/sde 
/dev/sdf 
/dev/sdg 
/dev/sdh 
/dev/sdi 
/dev/sdj 
/dev/sdk 
संबंधित मुद्दे