2012-11-10 10 views
11
echo -n 'I hate cats' > cats.txt 
sed -i '' 's/hate/love/' cats.txt 

यह फ़ाइल में सही ढंग से शब्द को बदलता है, लेकिन फ़ाइल के अंत में एक नई लाइन भी जोड़ता है। क्यूं कर? यह केवल ओएसएक्स में होता है, उबंटू आदि नहीं। मैं इसे कैसे रोक सकता हूं?ओएसएक्स में एक नई लाइन क्यों जोड़ती है?

+0

10,6 पर नहीं होता है। शायद आपका संस्करण हो सकता है। –

+2

यह 10.6.8 और 10.7.3 पर हो रहा है। हम्म। –

+0

आपका संपादन महत्वपूर्ण रूप से चीजों को बदलता है। मैंने नीचे जवाब दिया है। –

उत्तर

7
echo -n 'I hate cats' > cats.txt 

यह आदेश एकल उद्धरण के बीच 11 पात्रों के साथ 'cats.txt' की सामग्री को बस जाएँगे। यदि आप इस चरण में cats.txt के आकार की जांच करते हैं तो यह 11 बाइट होना चाहिए।

sed -i '' 's/hate/love/' cats.txt 

यह आदेश cats.txt फ़ाइल लाइन द्वारा लाइन पढ़ा जाएगा, और (एक फ़ाइल जहाँ प्रत्येक पंक्ति 'नफरत' 'प्यार' द्वारा प्रतिस्थापित का पहला उदाहरण पड़ा है साथ बदलें अगर इस तरह के एक उदाहरण मौजूद है)। महत्वपूर्ण हिस्सा समझ रहा है कि एक रेखा क्या है।

Normally, sed cyclically copies a line of input, not including its 
terminating newline character, into a pattern space, (unless there is 
something left after a ``D'' function), applies all of the commands 
with addresses that select that pattern space, copies the pattern 
space to the standard output, appending a newline, and deletes the 
pattern space. 

नोट appending a newline हिस्सा: sed आदमी पृष्ठ से। आपके सिस्टम पर, sed अभी भी आपकी फ़ाइल को एक पंक्ति के रूप में व्याख्या कर रहा है, भले ही कोई नई समाप्ति न हो। तो आउटपुट 11 वर्ण होंगे, साथ ही संलग्न नई लाइन भी होगी। अन्य प्लेटफॉर्म पर यह आवश्यक नहीं होगा। कभी-कभी sed पूरी तरह से फ़ाइल में अंतिम पंक्ति को छोड़ देगा (प्रभावी रूप से इसे हटा रहा है) क्योंकि it is not really a line! लेकिन आपके मामले में, sed मूल रूप से आपके लिए फ़ाइल को ठीक कर रहा है (इसमें फ़ाइल के रूप में कोई लाइन नहीं है, यह sed को टूटी हुई इनपुट है)।

यहां और विवरण देखें: Why should text files end with a newline?

आपकी समस्या के लिए एक वैकल्पिक दृष्टिकोण के लिए इस सवाल का देखें:

echo -n 'I hate cats' > cats.txt 
SAFE=$(cat cats.txt; echo x) 
SAFE=$(printf "$SAFE" | sed -e 's/hate/love/') 
SAFE=${SAFE%x} 

इस तरह बिल्लियों यदि: SED adds new line at the end

0

एक और बात आप कर सकते हैं यह है। txt समाप्त होता है एक नई लाइन में यह संरक्षित हो जाता है। यदि ऐसा नहीं होता है, तो इसे एक जोड़ा नहीं जाता है।

0

यह मेरे लिए काम किया। मुझे इंटरमीडिएट फ़ाइल का उपयोग करने की ज़रूरत नहीं थी।

OUTPUT=$(echo 'I hate cats' | sed 's/hate/love/') 
echo -n "$OUTPUT" 
+0

आपकी पहली 'echo' में '-n' नहीं है। –

0

ध्यान दें कि जीएनयू sed मैक ओएस पर नई लाइन नहीं जोड़ता है।

+0

मैंने अभी जीएसएड (जीएनयू sed) 4.4 स्थापित किया है और इसमें एक नई लाइन जोड़ा गया है। इसे स्वयं आज़माएं: 'ब्रू इंस्टॉल करें gnu-sed' –

+0

$ gsed --version जीएसएड (जीएनयू sed) 4.4 $ gsed -i' '/ नफरत/प्यार /' cats.txt $ xxd cats.txt 00000000 : 4920 6 सी 6 एफ 7665 2063 6174 73 मुझे बिल्लियों से प्यार है –

0

इस समस्या से बचने का एक अच्छा तरीका है sed के बजाय perl का उपयोग करना। पर्ल ईओएफ की नई लाइन, या इसकी कमी का सम्मान करेगा, जो मूल फ़ाइल में है।

echo -n 'I hate cats' > cats.txt 
perl -pi -e 's/hate/love/' cats.txt 
संबंधित मुद्दे