आउटपुट के कई लाइनों को एक लाइन में कैसे बदलना है?


158

यदि मैं कमांड चलाता हूं cat file | grep pattern, तो मुझे आउटपुट की कई लाइनें मिलती हैं। आप सभी पंक्तियों को एक पंक्ति में कैसे जोड़ते हैं, प्रभावी रूप से प्रत्येक "\n"को "\" "( "अंतरिक्ष के बाद अंत) के साथ प्रतिस्थापित करते हैं ?

cat file | grep pattern | xargs sed s/\n/ /g मेरे लिए काम नहीं कर रहा है।


वैसे: (1) आपको अपनी sedस्क्रिप्ट को एकल-उद्धरण में रखने की आवश्यकता है ताकि बैश इसके साथ गड़बड़ न करें (क्योंकि दो तर्कों के साथ sed s/\n/ /gकॉल sed, अर्थात् s/n/और /g); (2) के बाद से आप के उत्पादन में चाहते हैं cat file | grep patternहोने के लिए इनपुट करने के लिए sed, नहीं तर्क को sed, आप को खत्म करने की जरूरत है xargs; और (3) इसकी कोई आवश्यकता नहीं catहै, क्योंकि grepइसके दूसरे तर्क के रूप में एक फ़ाइल नाम लिया जा सकता है। तो, आपको कोशिश करनी चाहिए थी grep pattern file | sed 's/\n/ /g'। (इस मामले में उपरोक्त लिंक पर दिए गए कारणों के लिए, यह काम नहीं करेगा, लेकिन अब आप भविष्य के लिए जानते हैं।)
बर्बाद करें


68 वोटों के साथ प्रश्न (140k विचार) केवल 1 वोट (12k विचार) वाले पोस्ट के साथ दोहराया गया? यह सही नहीं है।
केनोरब

जवाबों:


231

tr '\n' ' 'सभी न्यूलाइन वर्णों को रिक्त स्थान पर अनुवाद करने के लिए उपयोग करें :

$ grep pattern file | tr '\n' ' '

नोट: grepफ़ाइलें पढ़ता है, फ़ाइलों को catसंगृहीत करता है। नहीं cat file | grep!

संपादित करें:

trकेवल एकल वर्ण अनुवाद ही संभाल सकता है। आप awkआउटपुट रिकॉर्ड विभाजक को बदलने के लिए उपयोग कर सकते हैं जैसे:

$ grep pattern file | awk '{print}' ORS='" '

यह रूपांतरित होगा:

one
two 
three

सेवा:

one" two" three" 

3
आप इस दृष्टिकोण के साथ अंत में एक अवांछित जगह के साथ एंडअप करते हैं।
सोरिन

1
आप जोड़ने की जरूरत echo ""संकेत पाठ से पहले नई लाइन को जोड़ने के लिए अंत में।
nexayq

1
यह अच्छी तरह से काम करता है, हालांकि मैं नहीं चाहता कि विभाजक बहुत अंतिम प्रविष्टि पर दिखाई दे। उदाहरण के लिए, आपके अनुसार ", यह दिखाता है one" two" three", हालांकि मैं चाहूंगा कि यह शो की तरह हो one" two" three। ध्यान दें अंतिम तीन में कोष्ठक नहीं है। कोई विचार?
oink

2
@oink आप sed '$s/..$//'अंतिम पंक्ति के अंतिम 2 वर्णों को हटाने के लिए परिणामों को पाइप कर सकते हैं ।
क्रिस सेमुर

3
यदि आप कुछ भी नहीं के साथ newlines को प्रतिस्थापित करना चाहते हैं, तो आपको --deleteविकल्प का उपयोग करने की आवश्यकता है क्योंकि डिफ़ॉल्ट दो तर्क की अपेक्षा करता है। उदा tr --delete '\n'
एलिजा लिन

69

पाइपिंग आउटपुट xargsरिक्त स्थान के साथ आउटपुट की प्रत्येक पंक्ति को एक पंक्ति में समेट देगा:

grep pattern file | xargs

या कोई कमांड, जैसे; ls | xargsxargsआउटपुट की डिफ़ॉल्ट सीमा ~ 4096 वर्ण है, लेकिन इसे उदाहरण के साथ बढ़ाया जा सकता है। xargs -s 8192


| tr '\n' ' 'जब php execफ़ंक्शन के माध्यम से कॉल किया गया तो मेरे लिए काम नहीं कर रहा था । यह tr को नजरअंदाज कर रहा था, और सिर्फ grep से आखिरी मैच दे रहा था। | xargsकाम किया।
आदर्श

3
इस समाधान में यह भी लाभ है कि यह इनपुट से रिक्त स्थान को खाता है। +1
रेने

55

echoबिना उद्धरण के बैश में गाड़ी के रिटर्न, टैब और कई स्पेस को हटा दें

echo $(cat file)

8
गंभीर रूप से अंडररेटेड उत्तर यहाँ, यह वास्तव में सरल है और एक आकर्षण की तरह काम करता है, साथ ही साथ एक अनुगामी न्यूलाइन भी।
डेंजरकोरो

यह विशेष रूप से साफ-सुथरा है यदि आप उपयोग करते हैंIFS="$(printf '\n\t')"
aggsol

5
या बस echo $(<file)... गूंज का उपयोग करना उपयोग करने की तुलना में सिर्फ भोजनालय नहीं है tr '\n' ' ', बल्कि बेहतर भी है ( \r\nलाइन एंडिंग सोचो )। @aggsol आप बस कह सकते हैंIFS=$'\n\t'
नॉर्मादाइज़

अंतरिक्ष के बिना कैसे?
डिमिडक

22

यह वही हो सकता है जो आप चाहते हैं

cat file | grep pattern | paste -sd' '

आपके संपादन के अनुसार, मुझे यकीन नहीं है कि इसका क्या मतलब है, शायद यह?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'

(यह मानता है कि ~इसमें नहीं होता है file)


2
@ स्टेफ़न को यह मानने की कोई आवश्यकता नहीं थी कि cat fileवास्तव में catएक फाइल होगी या नहीं। (मैं बस उस हिस्से को अपरिवर्तित छोड़ दिया क्योंकि यह प्रश्न के लिए अप्रासंगिक था)
sehe

5

यह एक उदाहरण है जो कॉमा द्वारा अलग से आउटपुट का उत्पादन करता है। आप जो भी विभाजक की आवश्यकता है, आप अल्पविराम को बदल सकते हैं।

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD

पैदा करता है:

1,2,3,4,5

3

यहाँ exसंपादक का उपयोग करने की विधि है ( विम का हिस्सा ):

  • जे सभी लाइनों और पी rint मानक उत्पादन करने के लिए:

    $ ex +%j +%p -scq! file
  • जे सभी लाइनों में जगह (फ़ाइल में):

    $ ex +%j -scwq file

    नोट: यह फ़ाइल के अंदर सभी लाइनों को अलग कर देगा-स्व!


2

इस समस्या को हल करने के सबसे आसान और आसान तरीके:

जब हम स्थान के साथ नई पंक्ति वर्ण बदलना चाहते हैं :\n

xargs < file

xargsप्रति पंक्ति वर्णों की संख्या और संयुक्त सभी वर्णों की संख्या की अपनी सीमाएं हैं, लेकिन हम उन्हें बढ़ा सकते हैं। इस आदेश को चलाकर विवरण प्राप्त किया जा सकता है: xargs --show-limitsऔर निश्चित रूप से मैनुअल में:man xargs

जब हम एक चरित्र को दूसरे बिल्कुल एक वर्ण से बदलना चाहते हैं :

tr '\n' ' ' < file

जब हम एक वर्ण को कई वर्णों से बदलना चाहते हैं :

tr '\n' '~' < file | sed s/~/many_characters/g

सबसे पहले, हम \nटिल्ड्स के लिए नए वर्णों को प्रतिस्थापित करते हैं ~(या पाठ में मौजूद अन्य विशिष्ट वर्ण का चयन नहीं करते हैं), और फिर हम टिल्ड वर्णों को किसी अन्य वर्णों ( many_characters) के साथ प्रतिस्थापित करते हैं और हम इसे प्रत्येक टिल्ड (ध्वज g) के लिए करते हैं।


0

संभवतः ऐसा करने का सबसे अच्छा तरीका 'awk' टूल का उपयोग करना है जो एक लाइन में आउटपुट उत्पन्न करेगा

$ awk ' /pattern/ {print}' ORS=' ' /path/to/file

यह अंतरिक्ष सीमांकक के साथ सभी लाइनों को एक में विलय कर देगा


आपको {print}इसके awk की डिफ़ॉल्ट क्रिया की आवश्यकता नहीं है ।
निरा

0

यहाँ एक और सरल विधि का उपयोग किया गया है awk:

# cat > file.txt
a
b
c

# cat file.txt | awk '{ printf("%s ", $0) }'
a b c

साथ ही, यदि आपकी फ़ाइल में कॉलम हैं, तो यह केवल कुछ कॉलमों को बदलने का आसान तरीका देता है:

# cat > cols.txt
a b c
d e f

# cat cols.txt | awk '{ printf("%s ", $2) }'
b e

-1

Red Hat linux पर मैं सिर्फ इको का उपयोग करता हूं:

इको $ (बिल्ली / कुछ / फ़ाइल / नाम)

यह मुझे सिर्फ एक लाइन पर एक फ़ाइल के सभी रिकॉर्ड देता है।


2
यह पहले से ही 2015 में उत्तर दिया जा चुका है। आप इस उत्तर को दोहरा रहे हैं । कृपया अपना स्वयं का पोस्ट करने से पहले उत्तर पढ़ें, विशेष रूप से जब प्रश्न 7 साल पुराना है और पहले से ही 8 उत्तर हैं।
मिकेल बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.