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


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


236
2018-02-17 03:21


मूल


अगर बड़ी फाइलों के लिए ऐसा करने का कोई प्रभावी तरीका नहीं है: unix.stackexchange.com/questions/87772/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
@ क्या आप इस विधि को देखेंगे superuser.com/a/1352628/11116 - Evan Carroll


जवाब:


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

319
2018-02-17 03:34



पहला महान काम करता है! क्या आप तर्क की व्याख्या करना चाहते हैं? मैं विशेष रूप से वाक्यविन्यास की व्याख्या करने के लिए निश्चित नहीं हूँ। - user479534
@ user8347: पाइप (|) संदेश (echo '...') सेवा मेरे cat जो उपयोग करता है - (मानक इनपुट) पहली फ़ाइल के रूप में और todo.txt दूसरे के रूप में। cat कई फाइलों को conCatenates। आउटपुट भेजें (>) नाम की एक फाइल के लिए temp। अगर कोई त्रुटि नहीं है (&&) से cat फिर नाम बदलें (mv) temp मूल फ़ाइल पर वापस फ़ाइल करें (todo.txt)। - Dennis Williamson
मुझे sed के आखिरी उदाहरण में इस संभावित वाक्यविन्यास के बारे में पता नहीं था, क्या कोई मुझे बता सकता है कि इस प्रकार के वाक्यविन्यास का नाम क्या है, इसलिए मैं इसके बारे में अधिक खोज सकता हूं? - Kira
@ किरा: द 1 का मतलब है कि अगली कमांड केवल फाइल में से एक लाइन पर और i आदेश डाला गया है। "पते" अनुभाग के अंतर्गत और "शून्य- या एक-पता आदेश" अनुभाग में मैन पेज में देखें। - Dennis Williamson
@ ट्रेसेंस: यदि आपका sed आदेश इस तरह कुछ दिखता है (एक प्रमुख टैब डालने): '1i\tSome Text', आपको बैकस्लैश को दोगुना करने की आवश्यकता हो सकती है। अन्यथा, आपकी बोलीभाषा sed पहचान नहीं सकता \t टैब के रूप में - Dennis Williamson


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

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

यह काम करता है क्योंकि अंदर के आदेश $(...) पहले निष्पादित किया जाता है todo.txt के साथ अधिलेखित है > todo.txt

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

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

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

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

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

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


60
2017-12-19 18:57



मुझे $ (...) निष्पादित नहीं किया गया है। - SCL
यह सिंगल के बजाय डबल कोट्स के साथ बेहतर (या बिल्कुल) काम कर सकता है ... - ℝaphink
नहीं होगा -e todo.txt के अंदर भागने के दृश्यों को भी परिवर्तित करें? - mk12
वर्कअराउंड उपज -> बिल्ली: <गंतव्य फ़ाइल नाम>: इनपुट फ़ाइल आउटपुट फ़ाइल है ... - ingyhere
printf प्लेटफार्मों में बहुत अधिक संगत होगा और आमतौर पर echo -e से अधिक सुचारु रूप से काम करना चाहिए - Peter Berg


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

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

यह एसटीडीआईएन "सोख जाएगा" और फिर फ़ाइल को लिखें, जिसका अर्थ है कि आपको अस्थायी फ़ाइलों के बारे में चिंता करने और उन्हें चारों ओर स्थानांतरित करने की आवश्यकता नहीं है।

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


27
2018-04-22 12:47





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

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

  2. i सम्मिलित

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


6
2018-04-11 00:23





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

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

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


4
2018-02-17 03:26



मान लें कि आप डिस्क स्थान से बाहर हैं ताकि new_todo.txt केवल आंशिक रूप से लिखा जाता है। आपका समाधान मूल फ़ाइल खोने लगता है। - NPE
डिस्क स्थान से कौन बाहर चलाता है? ;-) यह सिर्फ एक साधारण उदाहरण है। - Keith
@ किथ कोई भी वीएम पर काम कर रहा है जिसने विशेष रूप से बड़े वर्चुअल ड्राइव की आवश्यकता नहीं थी। या कोई बड़ी फाइल ले जा रहा है। किसी भी मामले में, इसके खिलाफ वास्तविक तर्क निर्देशिका अनुमतियां है; अगर आपको दी गई निर्देशिका में नई फाइलें बनाने की अनुमति नहीं है, तो केवल एक ही आदेश जो आपकी स्क्रिप्ट में सफलतापूर्वक निष्पादित होगा rm मूल फ़ाइल का। - Parthian Shot


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

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

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


3
2018-01-09 22:49



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


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

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

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

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

2
2018-02-17 06:25



Downvoters उनके प्रेरणा की व्याख्या करने के लिए स्वागत है। स्वीकृत समेत शेष उत्तरों में से कोई भी मेरे जवाब में कुछ भी विरोधाभास नहीं करता है। - jlliagre
<se> ब्रैकेट की तरह दिखने के रूप में पार्स करना मुश्किल है, जो मुझे लगता है कि वे नहीं हैं। <और (के बीच एक जगह के बीच एक जगह? - 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
@ डंबलड आप मेरे जवाब पर विचार कर रहे हैं। इसमें आपके लिए पार्स करने के लिए कुछ भी नहीं है। के बीच एक जगह < और यह ( वाक्यविन्यास तोड़ देगा। प्रयत्न cat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile' - jlliagre


आप उपयोग कर सकते हैं tee:

echo 'task goes here' | cat - todo.txt | tee todo.txt

0
2017-07-08 14:16



नहीं आप नहीं कर सकते askubuntu.com/a/752451 - Steven Penny


GitBash + विंडोज 10 + Multline:

यहां एक संस्करण है जो आपको उपयोग करने देता है बहु लाइन तार

##############################################
## 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]

0
2017-08-04 07:04