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


25

मैं पहले से मौजूद फ़ाइल के शीर्ष पर पाठ सम्मिलित करना चाहता हूं। इसे कैसे प्राप्त किया जा सकता है। मैंने कोशिश की echoऔर teeलेकिन सफल नहीं था।

मैं sources.listटर्मिनल से फ़ाइल के शीर्ष पर रेपो लाइन सम्मिलित करने का प्रयास कर रहा था ।

ध्यान दें

मुझे एक लाइन क्विक सॉल्यूशन की आवश्यकता है, क्योंकि दूसरे उत्तर की विधि मुझे पहले से ही पता थी


1
टी जैसे फ़ाइल के नीचे एक पंक्ति जोड़ता है echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list - आपको व्यवस्थापक विशेषाधिकारों को प्राप्त करने के लिए टी से पहले sudo की भी आवश्यकता होती है। लेकिन पृथ्वी पर आप सूत्रों के शीर्ष पर कुछ जोड़ना क्यों चाहेंगे?
सावास राड्विक

2
@medigeek: ओपी के प्रश्न इतिहास में कहीं न कहीं आपको सीडी-रेपो से अपडेट करने / अपडेट करने के बारे में कुछ मिलेगा ... मुझे संदेह है कि इसका कारण हो सकता है ...
ish

धन्यवाद @ मिक्स, आपकी धारणा सही है। मैं शांत हूं। क्या आप उस सवाल का जवाब भी दे सकते हैं। यह सॉफ्टवेयर-केंद्र का उपयोग करके स्थानीय रेपो से स्थापित करने के बारे में था और शीर्ष पर रखे बिना मेरी स्थानीय रेपो को सर्वोच्च प्राथमिकता के लिए स्थापित करना था। एक बार फिर धन्यवाद।
अनवर

1
@izx, यहाँ मेरे स्थानीय रिपॉजिटरी को सर्वोच्च प्राथमिकता देने के बारे में लिंक है। मुझे खुशी होगी अगर आप सॉफ्टवेयर सेंटर के बारे में इस प्रश्न की जांच कर सकते हैं । आपकी पहली टिप्पणी के लिए फिर से धन्यवाद। बहुत खुशी हुई।
अनवर

1
@medigeek, आप इस तरह के एक असामान्य प्रश्न की व्याख्या के लिए इस प्रश्न को देख सकते हैं ।
अनवर

जवाबों:


38

यह वास्तव में काफी आसान है sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1iफ़ाइल के पंक्ति 1 पर आने वाले पाठ को सम्मिलित करने के लिए sed को बताता है; \अंत में न्यूलाइन को न भूलें ताकि मौजूदा लाइन 1 को लाइन 2 में ले जाया जा सके।


1
धन्यवाद। सिर्फ नोट के लिए: यदि आप प्रतिस्थापित करना चाहते हैं, तो इसके sबजाय मैं अंदर का उपयोग डालने के बजाय 1i
अनवर

3
अफसोस की बात है कि यह खाली फ़ाइल के लिए विफल है (इसमें कोई मुट्ठी की रेखा नहीं है, इसलिए sed कभी सम्मिलित नहीं होती है)।
टिनो

@ खाली फ़ाइलों के लिए आप बस का उपयोग कर सकते हैंecho "Text Here" >> Filename
Flotolk

MacOS 10 पर काम नहीं करता
कृष्ण

7

एक स्क्रिप्ट के साथ सामान्य संपादन में मुश्किल है, लेकिन आप उपयोग कर सकते हैं echoऔरcat और उसके बादmv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

हालाँकि, अगर आप source.list से खेल रहे हैं, तो आपको त्रुटियों का पता लगाने के लिए कुछ सत्यापन और बुलेट-प्रूफिंग में जोड़ना होगा क्योंकि आप वास्तव में इसे ढीला नहीं करना चाहते हैं। लेकिन यह एक अलग सवाल है :-)


मैं ऐसा पहले ही कर सकता हूं। मुझे एक लाइन समाधान की आवश्यकता है जैसा कि izx ने दिया था। हालांकि आपके उत्तर के लिए धन्यवाद।
अनवर

1
@AnwarShah - आह क्षमा करें! आपको अपने प्रश्न में कहा जाना चाहिए :-)
शॉन

मैं मानता हूं, आपके उत्तर के लिए +1 और टिप्पणी के लिए भी। (मैं अधिक नहीं दे सकता)
अनवर

6
./prepend.sh "myString" ./myfile.txt

ज्ञात है कि prependहै अपने कस्टम खोल :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

रिलेटिफ़ पाथ या निरपेक्ष पथ का भी उपयोग करें, यह ठीक काम करना चाहिए:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

अद्यतन करें :

यदि आप इसके लिए एक स्थायी स्क्रिप्ट चाहते हैं, nano /etc/bash.bashrcतो फ़ाइल के अंत में यह फ़ंक्शन जोड़ें:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

आप फिर से खोलें और आनंद लें:

prepend "another line at top" /path/to/my/file.txt

5

और उसके लिए एक वास्तविक पाठ संपादक का उपयोग क्यों न करें? ed मानक पाठ संपादक है।

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

या, यदि आप चाहते हैं कि कमांड अधिक पठनीय हो:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: फर्स्टलाइन पर जाएं
  • i: इन्सर्ट मोड
  • अपना सामान आप सम्मिलित करना चाहते हैं ...
  • .: सम्मिलित करना बंद करें, सामान्य मोड पर वापस जाएं
  • wq: लिखो और छोड़ो, शुक्रिया, अलविदा।

इसके साथ शेल चर प्रतिस्थापन (कैसे) का उपयोग FIRST LINEकरें?
vp_arth

1
@vp_arth यदि आपकी सामग्री चर में है first_lineतो ed -s filename < <(printf '%s\n' 1i "$first_line" . wq):। सुनिश्चित करें कि चर एकल बिंदु तक विस्तृत नहीं है, और इसमें कोई भी नया वर्ण नहीं है (इसलिए यदि यह उपयोगकर्ता इनपुट से आता है, तो इसे साफ कर लें)।
gnourf_gniourf

3

हमेशा awkविकल्प होता है। stringचर को अपनी सामग्री से बदलें । हालांकि यह एक जगह में बदलाव नहीं है। व्यक्तिगत रूप से, मैं इन-प्लेस बदलाव नहीं करना चाहता हूं। यह निश्चित रूप से एक व्यक्तिगत प्राथमिकता है। दो चीजें, -vवैरिएबल में एक वैरिएबल को दर्शाता है और nएक प्रभावी ढंग से लाइन नंबर से मेल करने के लिए वेरिएबल का उपयोग यहां किया जाता है NR == 1। तुम बस के मान बदलकर किसी भी तरीके से इस इस्तेमाल कर सकते हैं nऔर s

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

उदाहरण:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line

2

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc '1i|hello world' -cx sources.list
  1. 1 पहली पंक्ति का चयन करें

  2. i टेक्स्ट की नई लाइन डालें

  3. x सहेजें और बंद करें


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