मैं एक लाइन में पैटर्न "मर्ज" कैसे कर सकता हूं?


10

मैं grep और sed कर रहा हूं और मुझे एक फाइल की 2 लाइनें मिल रही हैं, जिसमें मुझे दिलचस्पी है। मैं इन लाइनों को नई लाइन के चरित्र के साथ समाप्त होने वाली सिंगल लाइन में कैसे प्राप्त कर सकता हूं?
अब मुझे मिल रहा है:

pattern1  
pattern2  

मैं लेना चाहता हूँ pattern1 pattern2 \n


1
क्या आप अधिक नमूना डेटा साझा कर सकते हैं?
स्लम

उपयोग printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
वैलेंटाइन बजरमी

पेस्ट काम का उपकरण है, यदि आप आउटपुट की कई लाइनों को एक में मर्ज करने का इरादा कर रहे हैं।
स्लम

कोई विशेष उपकरण? आप इसे करने की योजना कैसे बनाते हैं?
ब्रिअम

जवाबों:


7

paste:

{...pipeline...} | paste -d " " - -

वह कहता है: "स्टडिन (पहली -) से एक लाइन पढ़ें, स्टडिन (दूसरी -) से दूसरी लाइन पढ़ें , फिर उन्हें एक स्पेस से जोड़ दें"


एक बैश-विशिष्ट तकनीक:

$ x=$(grep -o pattern. test.txt)
$ echo "$x"
pattern1
pattern2
$ mapfile -t <<< "$x"
$ echo "${MAPFILE[*]}"
pattern1 pattern2

रेफरी: http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile


क्या है - -? आज्ञा जैसी है?
जिम

@ जय - हाँ यह सही है। वे बता रहे हैं pasteकि आप कैसे चाहते हैं कि यह इनपुट को प्रोसेस करे। 2 एक बार में। समय पर 3 करने के लिए और जोड़ें। seq 10 | paste -d " " - -
स्लम

6

मैं तीन संस्करणों को एक पंक्ति में रखूँगा

AWK

printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'

एसईडी

printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'

टी.आर.

printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo

और भी कई हैं।


trसमाधान न खत्म होने वाली न्यू लाइन निगल जाएगा, तो आप जोड़ सकते हैं ; echoकि एक के लिए
ग्लेन जैकमैन

@glennjackman आह ठीक है! संकेत के लिए धन्यवाद। यद्यपि आप उत्तर को संशोधित करने के लिए स्वतंत्र हैं। मुझे वह याद आया!
वैलेंटाइन बजरमी

2

आप इसे शेल स्क्रिप्ट या कमांड-लाइन का उपयोग करके कर सकते हैं, बस कमांड के आउटपुट को एक वेरिएबल में डाल echoदें:

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2

निर्विवाद, चर भी फ़ाइल नाम विस्तार के अधीन है, इसलिए यदि आपके पास परिणाम में कोई ग्लोब वर्ण (जैसे *या ?) हैं, तो मान बदल सकते हैं।
बजे ग्लेन जैकमैन

@glennjackman, इस उल्लेख के लिए धन्यवाद, हम इसे कैसे ठीक कर सकते हैं?
निदाल

@ नेटवर्क्स बैकटिक्स का उपयोग न करके $().. बल्कि प्रिंटफ का उपयोग करकेprintf '%s\n' "$x"
वैलेंटाइन बजरमी

मुझे लगता है कि उम्मीद करेंगे printf '%s\n' "$x""आंतरिक" न्यू लाइन नहीं निकाला जाएगा।
ग्लेन जैकमैन

2

इसके साथ sed, आप यह कर सकते हैं:

<your previous commands> | sed '{N; s/\n/ /}'
  • N;sedअगली पंक्ति को पैटर्न स्पेस में जोड़ने के लिए कहता है, इसलिए अब sedदोनों लाइनों के साथ काम कर रहा है।
  • s/\n/ / एक स्थान के साथ नई लाइन वर्ण को प्रतिस्थापित करता है, दो लाइनों को एक साथ "मर्ज" करता है।

2

एक सरल तरीका, पाइप आउटपुट xargs:

$ echo -e 'a\nb' | xargs
a b

यह केवल छोटे ouput के साथ काम करता है, क्योंकि यह प्रति कमांड लाइन अधिकतम वर्णों द्वारा सीमित है। सबसे बड़ा मूल्य सिस्टम पर निर्भर करता है, आप इस मूल्य का उपयोग करके प्राप्त कर सकते हैं getconf ARG_MAX


1
( set -f; IFS='
'; printf '%s %s\n' $(grepcmd <input)
) >output

आप चाहें तो IFS इसे खाकर खुश होंगे।


-1

backticks में अपने sed / grep लपेटें

जब आपका मूल आदेश था:

grep -i 'foo' mylog.log | sed 's/bar/baz/gi'

आपका नया आदेश होगा:

`grep -i 'foo' mylog.log | sed 's/bar/baz/gi'`

लाइनों के बीच में रिक्त स्थान नहीं मिलता है, लेकिन आप हमेशा एक और सीड पाइप से निपट सकते हैं:

 | sed 's/$/ /'

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