আমি ব্যাশের কোনও ফাইলের শুরুতে কীভাবে পাঠ্য যুক্ত করব?


285

হাই আমি কোনও ফাইলে পাঠ্য পাঠাতে চাই। উদাহরণস্বরূপ, আমি একটি টোড.টিএসটিএস ফাইলের শুরুতে কাজগুলি যুক্ত করতে চাই। আমি সচেতন echo 'task goes here' >> todo.txtতবে এটি ফাইলের শেষে লাইন যুক্ত করে (আমি যা চাই তা নয়)।


2
বড় ফাইলগুলির জন্য এটি করার কোনও কার্যকর উপায় নেই: unix.stackexchange.com/questions/87772/…
Ciro

@ আপনি কি এই পদ্ধতিটি একবার দেখে নিন 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
প্রথমটি দুর্দান্ত কাজ করে! আপনি যুক্তি ব্যাখ্যা করতে মন চাইবেন? আমি সিনট্যাক্সের ব্যাখ্যা কীভাবে করব তা নিশ্চিত নয়।
ব্যবহারকারী 479534

44
@ user8347: পাইপ ( |) বার্তাটি ( echo '...') catযা -(ফাইলের প্রথম মান todo.txtহিসাবে এবং দ্বিতীয় হিসাবে ) ব্যবহার করে (মানক ইনপুট) । catএকাধিক ফাইল সংহত করে। >নামের একটি ফাইলে আউটপুট ( ) প্রেরণ করুন temp। যদি কোনও ত্রুটি না থাকে ( &&) catতবে ফাইলটিকে পুনরায় নামকরণ করুন ( mv) tempমূল ফাইলটিতে ( todo.txt)।
ডেনিস উইলিয়ামসন

1
@ আইফাইফ্রেনেল: আপনি যা করেছেন তা আমাকে দেখতে হবে, তবে যদি catআক্ষরিক ব্যাকস্ল্যাশ এন পায় তবে এটি এটিকে নতুন লাইনে রূপান্তরিত করবে না। অন্য কিছু নিশ্চয়ই তা করেছে। পরিবর্তে 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

অন্য উত্তরগুলি ঠিকঠাকভাবে কাজ করার সময়, আমি মনে রাখা এটিকে আরও সহজ মনে করি কারণ আমি প্রতিদিন প্রতিধ্বনি এবং বিড়াল ব্যবহার করি।

সম্পাদনা: যদি কোনও ব্যাকস্ল্যাশ থাকে তবে এই সমাধানটি খুব খারাপ ধারণা 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এগুলি ব্যবহার করবেন না। ঠিক আছে, দ্বিতীয় থেকে শেষটি বাদে। এটি শেষের সাথে গণ্ডগোল করে না।


1
আমি মোটেও $ (...) চালিত হই না।
এসসিএল


5
-eএছাড়াও কি টু ডট টেক্সটের ভিতরে পালানোর সিকোয়েন্সগুলি রূপান্তর করা হবে না ?
এম কে 12

2
ওয়ার্কআরউন্ডস ফলন -> বিড়াল: <গন্তব্য ফাইলের নাম>: ইনপুট ফাইল আউটপুট ফাইল ...
অন্তত এখানে

প্ল্যাটফর্মগুলিতে প্রিন্টফ অনেক বেশি সামঞ্জস্যপূর্ণ হবে এবং সাধারণত প্রতিধ্বনির চেয়ে আরও সুচারুভাবে কাজ করা উচিত
পিটার বার্গ

28

moreutilsনামক একটি চমৎকার টুল আছে sponge:

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

এটি STDIN "ভিজিয়ে" ফেলবে এবং তারপরে ফাইলটিতে লিখবে, যার অর্থ আপনাকে অস্থায়ী ফাইলগুলি নিয়ে এবং এগুলি ঘুরে বেড়াতে হবে না।

আপনি পেতে পারেন moreutilsমাধ্যমে অনেক লিনাক্স ডিস্ট্রো সঙ্গে apt-get install moreutilsOS X এর উপর ব্যবহার করে, বা Homebrew সঙ্গে brew install moreutils



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কেবল আংশিকভাবে লেখা হয়। আপনার সমাধানটি আসল ফাইলটি হারাতে পারে।
এনপিই

কে ডিস্ক স্পেস শেষ? ;-) এটি একটি সাধারণ উদাহরণ।
কিথ

2
@ কিথ এমন একজন ভিএম-তে কাজ করছেন যাঁর বিশেষ করে বড় ভার্চুয়াল ড্রাইভের প্রয়োজন হবে না বলে আশা করেন না। বা কেউ একটি বড় ফাইল সরানো। যাই হোক না কেন, এর বিরুদ্ধে আসল যুক্তি হ'ল ডিরেক্টরি অনুমতি; যদি আপনার প্রদত্ত ডিরেক্টরিতে নতুন ফাইল তৈরি করার অনুমতি না পান তবে আপনার স্ক্রিপ্টে সফলভাবে সম্পাদিত হবে এমন একমাত্র আদেশ হ'ল rmআসল ফাইলের of
পার্থিয়ান শট

3

যদি পাঠ্য ফাইলটি মেমরিতে ফিট করার জন্য যথেষ্ট ছোট হয় তবে আপনাকে এটির সাথে প্রতিস্থাপনের জন্য অস্থায়ী ফাইল তৈরি করতে হবে না। আপনি এগুলি সমস্ত মেমরিতে লোড করতে এবং ফাইলটিতে আবার লিখে দিতে পারেন।

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

পুরো ফাইলটি না লিখে ফাইলের শুরুতে লাইন যুক্ত করা অসম্ভব।


কেবল প্রকট প্রশ্নটি জিজ্ঞাসা করার জন্য: শেল ভেরিয়েবলের চরিত্রের সীমাটি কোথায়?
নিকদাদা

আমি যতদূর সচেতন, এটি কেবলমাত্র উপলব্ধ মেমরির পরিমাণেই সীমাবদ্ধ। আমি মেমরিতে 100MB এর বেশি ভেরিয়েবলগুলি পূরণ করেছি। text=$(cat file)। শুধুমাত্র পাঠ্য ব্যবহারের ক্ষেত্রে সতর্ক থাকুন, কারণ শেল ভেরিয়েবলগুলি বাইনারি পরিষ্কার নয় mywiki.wooledge.org/BashFAQ/058
রুসেন্ট 88

2

আপনি কোনও ফাইলের শুরুতে সামগ্রী sertোকাতে পারবেন না cannot কেবলমাত্র আপনি যা করতে পারেন তা হ'ল হয় বিদ্যমান সামগ্রীর প্রতিস্থাপন করা বা ফাইলের বর্তমান সমাপ্তির পরে বাইট যুক্ত করা।

আপনার প্রশ্নের যে কোনও সমাধানের পরে অস্থায়ী ফাইল (বা বাফার) তৈরি করতে হবে (মেমরিতে বা ডিস্কে) যা শেষ পর্যন্ত মূল ফাইলটি ওভাররাইট করে।

নতুন ফাইলটি তৈরি করার সময় মূল ফাইল সংরক্ষণ করে ডেটা হারাতে হবে না, প্রক্রিয়া চলাকালীন ফাইল সিস্টেমটি পূর্ণ হওয়া উচিত। উদাহরণ:

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

ডাউনভোটাররা তাদের অনুপ্রেরণার ব্যাখ্যা দিতে স্বাগত জানায়। গৃহীত উত্তর সহ বাকী কোনও উত্তরই আমার উত্তরে কোনও কিছুর বিরোধিতা করে না।
jlliagre

<...> বন্ধনীগুলির মতো দেখতে যেমনটি পার্স করা কঠিন, যা আমি অনুমান করি যে তারা তা নয়। <এবং এর মধ্যে একটি স্থান (সাহায্য করতে পারে?
ডাম্বলডেড

এটি আমার জন্য কাজ করছে না। echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'কাজ করে তবে cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'ত্রুটিটি দেয় "প্রতিধ্বনি: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"
ডাম্বলডেড

@ ডাম্বলড্যাড আপনি আমার উত্তরটিকে উড়িয়ে দিচ্ছেন। এতে পার্স করার জন্য আপনার কিছুই নেই। <এবং এর মধ্যে একটি স্থান (সিনট্যাক্সটি ভেঙে দেবে। চেষ্টা করুনcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
jlliagre


0

গিটব্যাশ + উইন্ডোজ 10 + মাল্টলাইন :

এখানে এমন একটি সংস্করণ যা আপনাকে মাল্টি-লাইন স্ট্রিংগুলি ব্যবহার করতে দেয় ।

##############################################
## 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]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.