2011-12-15 10 views
7

के माध्यम से किसी विशेष पाठ के बाद नई पंक्ति को निकालना मैं आंशिक स्ट्रिंग के बाद होने वाले सभी न्यूलाइन वर्ण को हटाना चाहता हूं और उसे टैब स्पेस के साथ बदलना चाहता हूं। कहो उदाहरण के लिए मेरी sample.txt रूपबैश/awk/sed/perl

foo 
bar bar bar bar some text 

इस प्रकार मैं इसे

foo bar bar bar bar some text 

होना चाहते हैं मैं पार्टी के माध्यम से/awk/SED ऐसा करने के लिए कैसे करते हैं। मदद करो

+0

"कुछ पाठ" के साथ क्या हुआ? –

+0

बस इसे याद किया, मुझे लगता है कि कोई फर्क नहीं पड़ता। इसलिए वांछित आउटपुट foo बार बार बार बार कुछ पाठ – Greenhorn

उत्तर

11

awk में:

awk '/foo$/ { printf("%s\t", $0); next } 1' 
+0

Woot! एक जिफ्फी में काम किया। धन्यवाद :) – Greenhorn

+0

हाँ, यह एक ठेठ अजीब दृष्टिकोण है। मैंने उत्तर के बीच कहीं नीचे एक sed समाधान लिखा ... :) – DejanLekic

+4

अंत में 1 के बारे में सोचने वालों के लिए; बस शब्दों में कहें, यह '{प्रिंट $ 0}' में अनुवाद करता है ताकि लाइनें जो * मेल नहीं खाती हैं, वे मुद्रित हैं क्योंकि वे मूल प्रारूप 'अजीब' हैं {/ some_pat/{/ * यदि पेट सत्य है * /} {/ * यदि पेट गलत है * /} '' –

2

सभी टूल्स न्यूलाइन प्रतिस्थापन नहीं कर सकते हैं। पर्ल कर सकते हैं:

cat file.txt | perl -p -e 's/\n/ /g' 
+3

मिमीएम होना चाहिए 1. आपने 'foo' आवश्यकता को याद किया। 2. आपने _tab_ आवश्यकता को याद किया – sehe

2

एमएमएम। यकीन नहीं यह आपकी आवश्यकताओं फिट बैठता है, लेकिन मैं vim में ऐसा चाहते हैं:

:g/^foo$/join 

या, यदि foo एक लाइन पर कहीं भी हो सकता है:

:g/foo$/join 
बेशक

, :%s/foo\n/foo\t/g भी अच्छी तरह से करना होगा

+0

इसे भी आजमाया! काम किया :) – Greenhorn

1

यह आप के लिए काम कर सकते हैं:यहाँ है कैसे

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/{N;s/\n/\t/}' 
foo  bar bar bar bar some text 
असल

:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/N;s/\n/\t/' 
foo  bar bar bar bar some text 

बाद का समाधान कम कुशल है लेकिन बहुत ज्यादा नहीं!

1
perl -pe 's/foo\n/foo\t/g' temp2.txt 

नीचे परीक्षण है।

243> cat temp2.txt 
foo 
bar bar bar bar some text 
pearl[[email protected]].244> perl -pe 's/foo\n/foo\t/g' temp2.txt 
foo  bar bar bar bar some text 
0

sed संस्करण लगता है कि

#!/bin/sed -f 
/foo/{ 
N 
s/\n/\t/ 
} 

यदि यह सब आप अपने sed आदेश में क्या करना चाहते है, तो आप एक एक लाइनर के लिए ऊपर को आसान बनाने में कर सकते हैं:

sed -e '/foo/N;y/\n/\t/' <sample.txt 

स्पष्टीकरण: N एक नई लाइन और इनपुट की अगली पंक्ति संलग्न करता है; y/\n/\t टैब के साथ सभी न्यूलाइन को प्रतिस्थापित करता है, या s/\n/\t/ टैब के साथ पहली नई लाइन को प्रतिस्थापित करता है।

ध्यान दें कि sed लाइन-ओरिएंटेड है, इनपुट में न्यूलाइन किसी भी पंक्ति के हिस्से के बजाय लाइन-विभाजक मानी जाती है (यह इसके विपरीत पर्ल के विपरीत है)।