बिल्ली कमांड में एक फ़ाइल के लिए एक पंक्ति को लागू करना?


12

मैं cat file.txtएक फ़ाइल की सामग्री प्राप्त करने के लिए कर सकता हूं लेकिन मैं अपने स्वयं के चयन की अंतिम पंक्ति से भी निपटना चाहता हूं।

मैंने पाइपिंग की कोशिश की (cat file.txt ; echo "My final line") |लेकिन केवल अंतिम लाइन पाइप से गुजर रही है। मैं बिल्ली और अंतिम पंक्ति में कैसे शामिल हो सकता हूं?

स्पष्टीकरण के बिंदु के लिए संपादित करें: मैं फ़ाइल को संशोधित करना नहीं चाहता। मुझे पता है कि अगर ऐसा होता तो मैं कर सकता था echo "My final line" >> file.txtया echo "My final line" | tee -a file.txtमैं केवल इस विशेष कमांड के संदर्भ में एपेंड करने की कोशिश कर रहा हूं ताकि मैं file.txtऔर के संयोजन में पाइप कर सकूं "My final line"


1
शायद कुछ पसंद है echo "My final line" >> file.txt?
एडविंकल

मैं वास्तव में लाइन ऑब्जेक्ट को केवल कमांड / पाइपिंग में फ़ाइल ऑब्जेक्ट में जोड़ना नहीं चाहता। मुझे पहले से ही पता है कि >>यदि मैं फ़ाइल को स्वयं संपादित करना चाहता हूं तो मैं उस पंक्ति को जोड़ सकता हूं।
डबलबैस

11
क्या आप गलती से मिट गए हैं file.txt? आपका पाइप स्निपेट काम करना चाहिए।
ब्रैकेन

@DoubleBass: मैथ्यू मिशेल का उत्तर एक बेहतर है, क्योंकि यह फ़ाइल (या तो इन-मेमोरी या डिस्क पर) को संशोधित नहीं करता है, बल्कि एक अंतर्निहित कमांड की सुविधा का उपयोग करता है।
ब्रायन बोएचर

जवाबों:


30

आप catइसे प्राप्त करने के लिए कई फ़ाइलों को पढ़ने की क्षमता के साथ संयुक्त स्टड से पढ़ने की क्षमता का लाभ उठा सकते हैं ।

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

आप एक पंक्ति को भी प्रस्तुत कर सकते हैं, जैसे:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

ध्यान दें कि आप एक लाइन तक सीमित नहीं हैं। catजब तक यह ईओएफ तक नहीं पहुंचता तब तक स्टड से पढ़ा जाएगा। आप आउटपुट को पास कर सकते हैं curl, उदाहरण के लिए, आउटपुट को प्रीपेन्ड या अपेंड करने के लिए cat

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>

1
(cat file.txt ; echo "My final line") | …भी कर लेते। लेकिन catइसके लिए जो डिजाइन किया गया था, उसका उपयोग करना बेहतर है +1।
ctrl-alt-delor

@ ctrl-alt-delor: उप-गोले में कांटे के लिए एक अतिरिक्त प्रक्रिया का नुकसान भी है जो अपेक्षाकृत महंगा है। उदाहरण के लिए echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catबनाम ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | catया यहां तक ​​कि प्रयास करें { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat
डेविड फ़ॉस्टर

12

किसी फ़ाइल में किसी पंक्ति को जोड़ने के लिए, आप केवल शेल अपेंडेंट पुनर्निर्देशन ऑपरेटर का उपयोग कर सकते हैं, >>(फ़ाइल ध्वज के open(2)साथ -ed होगी O_APPEND):

echo 'My final line' >>file.txt

अब, यदि आप फ़ाइल की सामग्री को अंतिम पंक्ति के साथ देखना चाहते हैं, तो मैं catदो तर्कों के साथ प्रयोग करूंगा :

  • सबसे पहले, आपकी फ़ाइल स्पष्ट रूप से, चलिए बताते हैं file.txt
  • दूसरा तर्क आपकी पसंद का स्ट्रिंग होगा, और स्ट्रिंग को फाइलनाम के रूप में पास करने के लिए ( catकेवल फाइलों के साथ सौदा करता है) आप प्रक्रिया प्रतिस्थापन का लाभ उठा सकते हैं <(), जो एक फ़ाइल विवरणक लौटाएगा ( /proc/self/fd/<fd_number>)

इन्हें एक साथ रखना:

cat file.txt <(echo 'My final line')

यदि आप चाहते हैं कि आउटपुट को पृष्ठांकित किया जाए, तो यह मान लेना lessकि आपका पसंदीदा पेजर है:

less file.txt <(echo 'My final line')

<()बैश के लिए काम करता है, लेकिन इसके लिए अन्य गोले क्या काम करते हैं? क्ष? डैश?
jpaugh

1
@ जौफ ksh, zsh- हां, dash- नहीं।
हेमायेल

यह मूल को संशोधित करता है।
बजे ctrl-alt-delor

11
sed -e '$aMy final line' file.txt

से man sedविकल्प-e

-e script, --expression=script
    add the script to the commands to be executed

$अंतिम पंक्ति से मेल खाता है और aस्ट्रिंग को जोड़ता है।

यदि आप फ़ाइल में लाइन को स्थायी रूप से जोड़ना चाहते हैं, तो उपयोग करें -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

को कमांड को बदलना

sed -i -e '$aMy final line' file.txt

1
एकल उद्धरणों का उपयोग करें और आपको बैकस्लैश की आवश्यकता नहीं है।
वाइल्डकार्ड

7

यह पहले से ही प्रश्न के लिए टिप्पणियों में स्पष्ट किया गया था, लेकिन इसे फिर से यहां एक उत्तर के रूप में जोड़ रहा है।

सवाल में कहा गया आदेश,

(cat file.txt ; echo "My final line") | other command

अपेक्षा के अनुसार काम करता है - कोष्ठक द्वारा गठित उपधारा से सभी आउटपुट को दूसरी कमांड पर पाइप किया जाता है।

यदि फ़ाइल एक नई लाइन के साथ समाप्त नहीं होती है, तो गूँजती हुई स्ट्रिंग को अंतिम पंक्ति में जोड़ दिया जाता है - यह यहाँ अन्य सभी समाधानों के साथ आम है, और इससे पहले एक और (खाली) इको जोड़कर हल किया जा सकता है।


1
फ़ाइल एक नई पंक्ति के साथ खत्म नहीं होता है, मैं का उपयोग करें awk: awk 1 file.txt; echo "My final line"awk 1 fileफ़ाइल के अंत में गायब ईओएल की भरपाई करने के लिए एक अच्छी चाल है।
मुरु

यदि फ़ाइल एक नई पंक्ति के साथ समाप्त नहीं होती है, तो आप echo "\nMy final line"बिना निर्भर होने के लिए भी उपयोग कर सकते हैंawk
19 '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.