नई पंक्ति के बिना प्रतिध्वनि के साथ पाठ जोड़ें


16

मैं पाठ को फ़ाइल की तरह जोड़ना चाहता हूं echo "abc" >>file.txt

लेकिन इस ऐड abcनई लाइन के बाद

मैं abcनई पंक्ति के बिना इको के साथ फ़ाइल के अंत में कैसे जोड़ सकता हूं ?


2
फ़ाइल में पहले से ही एक नई पंक्ति है, आप इसके बाद जोड़ रहे हैं। तो आपको नई लाइन को "एबीसी" के साथ अंतिम पंक्ति से बदलना होगा।
ctrl-alt-delor

StackExchange में आपका स्वागत है! आपका प्रश्न अच्छा है; यह बेहतर होता अगर आप अपनी फ़ाइल की सामग्री के उदाहरणों को निर्दिष्ट करते (इससे पहले, आपको इसके अलावा क्या मिलता है, इसके बजाय आपको क्या चाहिए)। मैं यह कहता हूं क्योंकि उत्तरों में से एक यह है कि abcअंतिम अंतिम पंक्ति के बिना कैसे जोड़ा जाए , जो (आपके प्रश्न को ध्यानपूर्वक पढ़ने के बाद) वह नहीं लगता जो आप चाहते हैं।
कानून २

जवाबों:


19

echo "abc" >>file.txtपहले नहीं, बाद में एक नई लाइन डालता है abc। यदि आप abcइसकी अपनी लाइन के साथ समाप्त हो जाते हैं , तो इसका मतलब है कि पहले की नई लाइन पहले abcसे मौजूद थी file.txt

ध्यान दें कि टेक्स्ट फ़ाइल के लिए एक नई पंक्ति में समाप्त होना पूरी तरह से सामान्य है। यूनिक्स पर, एक पंक्ति में null new या newline के अलावा अन्य वर्णों का अनुक्रम होता है, जिसके बाद एक newline होता है। 1 इसलिए कोई भी गैर-रिक्त पाठ फ़ाइल एक नए वर्ण के साथ समाप्त होती है।

यदि आप किसी फ़ाइल की अंतिम पंक्ति में पाठ जोड़ना चाहते हैं, तो आप ऐसा नहीं कर सकते >>, क्योंकि यह हमेशा फ़ाइल में संलग्न होता है, इसलिए यह हमेशा अंतिम नई पंक्ति के बाद लिखता है। इसके बजाय आपको एक उपकरण की आवश्यकता है जो किसी मौजूदा फ़ाइल को संशोधित करने में सक्षम हो। उदाहरण के लिए, आप sed का उपयोग कर सकते हैं :

sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt

Sed कमांड में, पहले का $अर्थ है "अंतिम पंक्ति पर केवल निम्न कमांड करें", कमांड s/REGEX/REPLACEMENT/रेप्लेकशन द्वारा REGEX की जगह लेती है, और $लाइन के अंत में नियमित अभिव्यक्ति मेल खाती है।

लिनक्स की सीड कमांड में एक बिल्ट-इन फीचर है जो इस क्रिएट-न्यू-फाइल-एंड-रिप्लेसमेंट सीक्वेंस को स्वचालित करता है, जिससे आप इसे छोटा कर सकते हैं

sed -i '$ s/$/abc/' file.txt

Ull यह एक अशक्त बाइट है, जिसे ASCII NUL और Unicode U + 0000 कहता है। पाठ प्रसंस्करण कार्यक्रम इस चरित्र के साथ सामना कर सकते हैं या नहीं कर सकते हैं।
1 आईईईई 1003.1-2008 के आधार परिभाषा अध्याय के "परिभाषाएँ" खंड में पाठ फ़ाइल , रेखा और न्यूलाइन चरित्र की परिभाषाएँ देखें: 2016।


2
क्या आपके दूसरे पैराग्राफ का मतलब यह है कि एक फाइल जो एक नई लाइन के साथ समाप्त नहीं होती है, वह टेक्स्ट फाइल नहीं है? उदाहरण के लिए, यदि मैं एक मौजूदा ASCII पाठ फ़ाइल लेता हूं जो एक नई पंक्ति के साथ समाप्त होती है और एक एकल बाइट 0x41(ASCII 'A') को जोड़ देती है , तो यह तकनीकी रूप से पाठ फ़ाइल नहीं रह जाती है? यदि हां, तो मेरा सुझाव है कि उस बिंदु पर जोर देने के बाद से यह एक अनूठे परिभाषा की तरह है; यदि नहीं, तो शब्दांकन में थोड़ा सा बदलाव भ्रम से बचने में मदद कर सकता है।
डेविड जेड

2
@ डेविड: यह यूनिक्सलैंड में एक टेक्स्ट फाइल की मानक परिभाषा है। IIRC यह भी POSIX में कहीं है।
केविन

1
@ केविन दिलचस्प, मैंने पहले कभी नहीं सुना। ठीक है, भले ही यह मानक है, मुझे लगता है कि यह एक प्रकार का अनैतिक है।
डेविड जेड

15

मुझे नहीं लगता कि यह echoकमांड के साथ संभव है , sedइसके बजाय निम्नलिखित दृष्टिकोण का उपयोग करें:

sed -i '$ s/$/abc/' file.txt
  • -i- फ़ाइल को निष्क्रिय कर दें
  • $ - पिछले रिकॉर्ड / लाइन को इंगित करें
  • s/$/abc/- विकल्प के $साथ लाइन के अंत का विकल्प abc(अंतिम रिकॉर्ड के लिए)

2
ध्यान दें कि "जगह" वास्तव में जगह में नहीं है। इसका अर्थ है "संपादित की गई सामग्री को मौजूदा फ़ाइल के साथ अस्थायी नाम की फ़ाइल में लिखें और फिर उसे बदल दें"। आप इस पर साबित कर सकते हैंdate >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
roaima

@roaima, मुझे sed बदलते इनोड नंबर के बारे में पता है।
रोमनपेरेक्रेस्ट

2
मैंने सोचा था कि तुम हो गया होता, लेकिन मैं चिंतित था की अपनी जोर देने के साथ कि inplace ओपी रात लगता है कि यह डबल डिस्क स्थान उपयोग करते हैं, उदाहरण के लिए एक बड़ी फ़ाइल के साथ से बचने के लिए इस्तेमाल किया जा सकता।
रोज़ा

@roaima, रात सोचते हैं -> सोच सकते हैं ...
RomanPerekhrest

अगर मैं एक चर के साथ एबीसी को बदलना चाहता हूं तो क्या होगा? '$ s/$/$1/'प्रिंट्स का उपयोग करना$1
फ्लोरियन Castelain

15

यह मानते हुए कि फ़ाइल पहले से ही एक नई पंक्ति में समाप्त नहीं होती है और आप बस बिना किसी पाठ को जोड़े कुछ और जोड़ना चाहते हैं, आप -nतर्क का उपयोग कर सकते हैं , जैसे

echo -n "some text here" >> file.txt

हालाँकि, कुछ UNIX सिस्टम यह विकल्प प्रदान नहीं करते हैं; अगर ऐसा है तो आप इसका उपयोग कर सकते हैं printf, जैसे

printf %s "some text here" >> file.txt

(आरंभिक %sतर्क में अतिरिक्त पाठ के साथ रक्षा करने के लिए किया जा रहा है, जिसमें %वर्ण स्वरूपण हैं)

से man echo(macOS हाई सिएरा पर):

-n

अनुगामी न्यूलाइन वर्ण प्रिंट न करें। यह '\c'स्ट्रिंग के अंत में संलग्न करके भी प्राप्त किया जा सकता है , जैसा कि iBCS2 संगत सिस्टम द्वारा किया जाता है। ध्यान दें कि यह विकल्प और साथ ही साथ '\c'IEEE Std 1003.1-2001 ("POSIX.1") में कार्यान्वयन-परिभाषित के प्रभाव को कोर द्वारा संशोधित किया गया है। 1-2002। अधिकतम पोर्टेबिलिटी के लिए लक्ष्य करने वाले अनुप्रयोगों को दृढ़ता printf(1)से न्यूलाइन चरित्र को दबाने के लिए उपयोग करने के लिए प्रोत्साहित किया जाता है ।


यह काफी स्पष्ट रूप से करता है एक नई पंक्ति के साथ खत्म। echo -nके अंत में कोई नई रेखा नहीं डाली जाएगी abc, लेकिन abcफिर भी एक नई पंक्ति से पहले होगा, जिसे उपयोगकर्ता बचना चाहता है।
Kusalananda

@ कुसलानंद मेरा जवाब इस धारणा का उपयोग करते हुए अधिक था कि ओपी उनकी प्रक्रिया को बदलने की कोशिश करेगा जैसे कि \nपहले स्थान पर स्पष्ट नहीं दिखा। अधिक विकल्प बेहतर होते हैं, खासकर जब वे हर बार पूरी फ़ाइल को फिर से लिखने के लिए शामिल नहीं होते हैं, जो एक बार होता है (जो बार-बार किया जाता है, बल्कि बहुपदीय समय में धीमा हो सकता है और चल सकता है)।
शराबी

9

यदि आपके पास truncateकमांड है और आपकी टेक्स्ट फाइल में एनएल है, तो उसके अंतिम पात्र के रूप में आप इसे हटा सकते हैं और फिर अपने टेक्स्ट को इस तरह जोड़ सकते हैं:

truncate --size -1 file.txt
echo "abc" >>file.txt

(ध्यान दें कि truncateफ़ाइल सामग्री के बारे में कुछ भी परवाह नहीं है, और इस उदाहरण में फ़ाइल का आकार केवल एक बाइट को कम करता है। यदि आपका अंतिम चरित्र एक एकल बाइट नहीं है, अर्थात यह एक बहु-बाइट "विस्तृत" वर्ण है तो आप भ्रष्टाचार का परिचय देंगे।)


5

आप जो चाहते हैं, उसे अंतिम पंक्ति के अंत में जोड़ना है, इसलिए उस अंतिम पंक्ति के सीमांकक से पहले, इसलिए फ़ाइल के अंतिम वर्ण से ठीक पहले।

के साथ ksh93, आप कर सकते हैं:

echo abc 1<> file >#((EOF - 1))

स्टैडआउट पर 1<>रीड + राइट मोड (और ट्रंकेशन के बिना अधिक महत्वपूर्ण रूप से ) में एक फ़ाइल खोलने के लिए मानक ऑपरेटर कहां है और >#((...))एक ksh93- विशिष्ट मांग ऑपरेटर है (यहां अंतिम बाइट से पहले तलाश करना है)। ध्यान दें कि जहां echoलिखता है abc<newline>वहां की aनई लाइन को ओवरराइट करता है और echoअपनी खुद की नई लाइन जोड़ता है।

zshबराबर:

zmodload zsh/system
{sysseek -w end -u 1 -1 && echo abc} 1<> file

हालांकि अधिक सटीक समकक्ष के लिए, आपको असफलता पर एक त्रुटि संदेश भी प्रिंट करना होगा:

zmodload zsh/system
if sysseek -w end -u 1 -1; then
  echo abc
else
  syserror -p "$0: $LINENO: seek: "
fi 1<> file

-1

शायद एक UUOC लेकिन आप भी कर सकते हैं:

echo "$(cat file.txt)abc" >file.txt

जैसा कि गिले बताते हैं कि यह आदेश सीमित है:

यह ज्यादातर काम करता है, लेकिन ऐसा नहीं है कि कभी-कभी फ़ाइल के अंत में एक खाली लाइन और तुरंत पहले एक खाली लाइन होती है। उदाहरण के लिए, निश्चित संख्या वाली रेखाओं वाली एक फ़ाइल, जहाँ अंतिम पंक्ति शुरू में खाली होती है और समय के साथ विस्तारित होती है, और अगली-से-अंतिम पंक्ति कभी-कभी खाली हो सकती है।

इसके अतिरिक्त उन catफाइलों पर प्रयोग करने से सावधान रहें जिनसे आप परिचित नहीं हैं:

निष्कर्ष :

सेड का प्रयोग करें


2
यह ज्यादातर काम करता है, लेकिन ऐसा नहीं है कि कभी-कभी फ़ाइल के अंत में एक खाली लाइन और तुरंत पहले एक खाली लाइन होती है। उदाहरण के लिए, निश्चित संख्या वाली रेखाओं वाली एक फ़ाइल, जहाँ अंतिम पंक्ति शुरू में खाली होती है और समय के साथ विस्तारित होती है, और अगली-से-अंतिम पंक्ति कभी-कभी खाली हो सकती है।
गिल्स एसओ- बुराई को रोकना '

क्या मुझे इसे हटा देना चाहिए? मुझे निश्चित रूप से लगता है कि रोमन / आपका उत्तर जाने का उचित तरीका है, लेकिन मुझे पता है कि मैं व्यक्तिगत रूप से विकल्प देखना पसंद करता हूं, और ओपी ने पूछा echo: पी
jesse_b

1
इसके अलावा यह पूरी फाइल को कमांड लाइन पर रखता है
n.caillou

@ n.caillou हुह? यह STDOUT को कुछ भी प्रिंट नहीं करेगा।
jesse_b

2
ठीक है, उन कमजोरियों में से कोई भी वास्तव में संबंधित नहीं हैं cat, लेकिन टर्मिनल पर भेजे जाने वाले मनमाने ढंग से भागने के अनुक्रम के साथ मुद्दों पर।
ilkkachu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.