मैं बैश में फ़ाइल की शुरुआत में टेक्स्ट कैसे जोड़ सकता हूं?


285

नमस्ते मैं एक फ़ाइल के लिए पाठ प्रस्तुत करना चाहता हूँ। उदाहरण के लिए, मैं एक todo.txt फ़ाइल की शुरुआत में कार्य जोड़ना चाहता हूं। मुझे पता है, echo 'task goes here' >> todo.txtलेकिन यह फ़ाइल के अंत में लाइन जोड़ता है (जो मुझे चाहिए)।


2
अगर बड़ी फ़ाइलों के लिए ऐसा करने का कोई कारगर तरीका नहीं है: unix.stackexchange.com/questions/87772/…
Ciro Santilli 新疆 to to to 事件

@ क्या आप इस विधि पर एक नज़र रखना superuser.com/a/1352628/11116
इवान कैरोल

जवाबों:


374
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt

या

sed -i '1s/^/task goes here\n/' todo.txt

या

sed -i '1itask goes here' todo.txt

4
पहले एक महान काम करता है! क्या आप तर्क की व्याख्या करना चाहेंगे? मैं विशेष रूप से वाक्यविन्यास की व्याख्या करने के लिए निश्चित नहीं हूं।
user479534

44
@ user8347: पाइप ( |) संदेश ( echo '...') catजिसके लिए -(मानक इनपुट) पहली फ़ाइल के todo.txtरूप में और दूसरे के रूप में उपयोग करता है । catकई फ़ाइलों को जोड़ता है। >नाम से एक फ़ाइल के लिए उत्पादन ( ) भेजें temp। यदि तब से कोई त्रुटि ( &&) नहीं है, catतो नाम बदलें ( mv) tempमूल फ़ाइल पर वापस जाएं ( todo.txt)।
डेनिस विलियमसन 4

1
@itaifrenkel: मुझे यह देखना होगा कि आपने क्या किया है, लेकिन अगर catशाब्दिक बैकस्लैश n प्राप्त होता है, तो यह इसे एक नई पंक्ति में परिवर्तित नहीं करेगा। कुछ और ही किया होगा। इसके बजाय cat, पाइपिंग को hexdump -Cयह देखने की कोशिश करें कि क्या आप वास्तव में बैकस्लैश और एन भेज रहे हैं या यदि यह एक नई रूपरेखा है। तुम भी cat -eलाइन अंत दिखाने की कोशिश कर सकते हैं।
डेनिस विलियमसन

1
2 और 3 का उपयोग करना (3 मेरे लिए सरल प्रतीत होता है) आपको एक ही बार में कई फ़ाइलों के पाठ को प्रस्तुत करने की अनुमति देता है ।
फेलिक्स

4
@ किरा: इसका 1मतलब है कि अगला कमांड केवल फाइल के लाइन एक पर है और iकमांड इन्सर्ट है। "पते" अनुभाग के तहत और "शून्य- या एक- पता कमांड" अनुभाग के तहत आदमी पृष्ठ में देखें।
डेनिस विलियमसन

73

मेरी राय में एक सरल विकल्प है:

echo -e "task goes here\n$(cat todo.txt)" > todo.txt

यह काम करता है क्योंकि $(...)इससे पहले के कमांड को निष्पादित किया todo.txtजाता है> todo.txt

जबकि अन्य उत्तर ठीक काम करते हैं, मुझे यह याद रखना बहुत आसान लगता है क्योंकि मैं प्रतिदिन इको और बिल्ली का उपयोग करता हूं।

EDIT: यदि कोई बैकस्लैश अंदर हैं todo.txt, तो यह समाधान बहुत बुरा विचार है , क्योंकि -eझंडा गूंज के लिए धन्यवाद उन्हें व्याख्या करेगा। एक और, आसान तरीका है प्रस्तावना स्ट्रिंग में newlines पाने के लिए है ...

echo "task goes here
$(cat todo.txt)" > todo.txt

... बस newlines का उपयोग करने के लिए। निश्चित रूप से, यह अब वन-लाइनर नहीं है, लेकिन वास्तविक रूप से यह पहले भी एक-लाइनर नहीं था। यदि आप इसे किसी स्क्रिप्ट के अंदर कर रहे हैं, और इंडेंट करने के बारे में चिंतित हैं (जैसे कि आप इसे किसी फ़ंक्शन के अंदर निष्पादित कर रहे हैं) तो इसे अभी भी अच्छी तरह से फिट करने के लिए कुछ वर्कअराउंड हैं, जिनमें शामिल हैं:

(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt

इसके अलावा, यदि आप इस बात की परवाह करते हैं कि क्या कोई नई पंक्ति इसके अंत में जोड़ी जाती है todo.txt, तो इनका उपयोग न करें। खैर, दूसरे-से-आखिरी को छोड़कर। यह अंत के साथ गड़बड़ नहीं है।


1
मुझे $ (...) बिल्कुल नहीं मिला।
SCL

2
सिंगल के बजाय डबल कोट्स के साथ बेहतर (या बिल्कुल भी) काम कर सकता है
फिंक

5
-eभी todo.txt के अंदर भागने के दृश्यों को परिवर्तित नहीं करेंगे ?
mk12

2
वर्कअराउंड्स की उपज -> बिल्ली: <गंतव्य फ़ाइल नाम>: इनपुट फ़ाइल आउटपुट फ़ाइल है ...
२०

प्रिंटफ़ प्लेटफ़ॉर्म पर बहुत अधिक सुसंगत होगा और आम तौर पर गूंज की तुलना में अधिक सुचारू रूप से काम करना चाहिए
पीटर बर्ग

28

moreutilsकहा जाता है एक अच्छा उपकरण है sponge:

echo "task goes here" | cat - todo.txt | sponge todo.txt

यह "STDIN सोख लेगा" और फिर फाइल पर लिख देगा, जिसका मतलब है कि आपको अस्थायी फ़ाइलों के बारे में चिंता करने और उन्हें इधर-उधर करने की ज़रूरत नहीं है।

आप प्राप्त कर सकते हैं moreutils, के माध्यम से कई Linux distros के साथ apt-get install moreutilsओएस एक्स पर का उपयोग कर, या Homebrew , साथ brew install moreutils


मैं (echo 'ble'; cat todo.txt):-) के लिए जाऊंगा
Ciro Santilli 改造

11

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

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 पहली पंक्ति का चयन करें

  2. i सम्मिलित

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


5

आप एक नई, अस्थायी फ़ाइल बना सकते हैं।

echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt

आप भी उपयोग sedकर सकते हैं या awk। लेकिन मूल रूप से वही होता है।


1
कहते हैं कि आप डिस्क स्थान से बाहर हैं ताकि new_todo.txtआंशिक रूप से ही लिखा जाए । मूल फ़ाइल खोने के लिए आपका समाधान दिखाई देता है।
NPE

डिस्क स्थान से कौन चलाता है? ;-) यह सिर्फ एक सरल उदाहरण है।
कीथ

2
@ कोई एक वीएम पर काम कर रहा है, जिसे विशेष रूप से बड़ी वर्चुअल ड्राइव की आवश्यकता नहीं थी। या कोई बड़ी फ़ाइल ले जा रहा है। किसी भी मामले में, इसके खिलाफ असली तर्क निर्देशिका अनुमतियाँ हैं; यदि आपके पास दी गई निर्देशिका में नई फाइलें बनाने की अनुमति नहीं है, तो एकमात्र आदेश जो आपकी स्क्रिप्ट में सफलतापूर्वक निष्पादित होगा rm, मूल फ़ाइल का है।
पार्थियन शॉट

3

यदि पाठ फ़ाइल स्मृति में फिट होने के लिए पर्याप्त छोटी है, तो आपको इसे बदलने के लिए एक अस्थायी फ़ाइल बनाने की आवश्यकता नहीं है। आप इसे सभी मेमोरी में लोड कर सकते हैं और इसे फाइल में वापस लिख सकते हैं।

echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt

संपूर्ण फ़ाइल को लिखे बिना फ़ाइल की शुरुआत में लाइनें जोड़ना असंभव है।


बस स्पष्ट सवाल पूछने के लिए: शेल चर की चरित्र सीमा कहां है?
22

जहां तक ​​मुझे जानकारी है, यह केवल उपलब्ध स्मृति की मात्रा से सीमित है। मैंने 100MB से अधिक के चर को स्मृति में भर दिया है। text=$(cat file)। हालांकि केवल पाठ का उपयोग करने के लिए सावधान रहें, क्योंकि शेल चर द्विआधारी स्वच्छ mywiki.wooledge.org/BashFAQ/058
Rucent88

2

आप किसी फ़ाइल की शुरुआत में सामग्री नहीं डाल सकते। केवल एक चीज जो आप कर सकते हैं वह या तो मौजूदा सामग्री को बदल देती है या फ़ाइल के वर्तमान छोर के बाद बाइट्स को जोड़ देती है।

आपके प्रश्न के किसी भी समाधान के लिए फिर एक अस्थायी फ़ाइल (या बफर) बनाने की आवश्यकता होती है (मेमोरी या डिस्क पर) जो अंततः मूल फ़ाइल को अधिलेखित कर देगी।

नया बनाते समय मूल फ़ाइल को संरक्षित करके डेटा को न खोने से सावधान रहें, क्या प्रक्रिया के दौरान फ़ाइल सिस्टम पूर्ण होना चाहिए। उदाहरण के लिए:

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt

डाउनवोटर्स का उनकी प्रेरणा को समझाने के लिए स्वागत है। शेष उत्तरों में से कोई भी, जिसमें स्वीकृत एक भी शामिल है, मेरे उत्तर में कुछ भी विरोधाभासी नहीं है।
jlliagre

यह कोष्ठक के रूप में पार्स करना मुश्किल है <...> कोष्ठक की तरह दिखते हैं, जो मुझे लगता है कि वे नहीं हैं। <और the के बीच का स्थान
dumbledad

यह मेरे लिए काम नहीं कर रहा है। echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'काम करता है, लेकिन cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'त्रुटि देता है "गूंज: ऐसी कोई फ़ाइल या निर्देशिका नहीं"
dumbledad

@dumbledad आप मेरे उत्तर को पलट रहे हैं। इसमें पार्स करने के लिए आपके पास कुछ भी नहीं है। <और के बीच एक स्थान (वाक्यविन्यास को तोड़ देगा। कोशिश करेंcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
jlliagre


0

GitBash + Windows10 + मल्टीलाइन :

यहां एक संस्करण है जो आपको मल्टी-लाइन स्ट्रिंग्स का उपयोग करने देता है ।

##############################################
## This section for demo purpose only,      ##
## So you can save entire file as           ##
## whatever.sh and run it.                  ##
##                                          ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################

## Below is main code:

##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//|  +-------------------------------------+   |//
//|  |                                     |   |//
//|  |     MESSAGE_FOR_HEAD_OF_FILE        |   |//
//|  |                                     |   |//
//|  +-------------------------------------+   |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE                       ##
TEX=$ADD_TO_HEAD_VARIABLE                       ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################

## Expected contents of MY_TARGET_FILE.txt :
## //|  +-------------------------------------+   |//
## //|  |                                     |   |//
## //|  |     MESSAGE_FOR_HEAD_OF_FILE        |   |//
## //|  |                                     |   |//
## //|  +-------------------------------------+   |//
## [STARTER_CONTENT]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.