এটি সম্ভবত একটি জটিল সমাধান ।
আমি ">>" এর মতো একটি সহজ অপারেটর খুঁজছি, তবে প্রিপেন্ডিংয়ের জন্য।
আমি ভয় করি এর অস্তিত্ব নেই। আমাকে এরকম কিছু করতে হবে
এমভি মাইফাইল টিএমপি বিড়াল মাইহেডার tmp> মাইফাইল
বুদ্ধিমান কিছু?
এটি সম্ভবত একটি জটিল সমাধান ।
আমি ">>" এর মতো একটি সহজ অপারেটর খুঁজছি, তবে প্রিপেন্ডিংয়ের জন্য।
আমি ভয় করি এর অস্তিত্ব নেই। আমাকে এরকম কিছু করতে হবে
এমভি মাইফাইল টিএমপি বিড়াল মাইহেডার tmp> মাইফাইল
বুদ্ধিমান কিছু?
উত্তর:
হ্যাক নীচে একটি দ্রুত বন্ধ-কড়া উত্তর যা কাজ এবং প্রাপ্ত upvotes প্রচুর ছিল। এরপরে, প্রশ্নটি আরও জনপ্রিয় হওয়ার সাথে সাথে আরও সময় অতিবাহিত হওয়ার সাথে সাথে ক্ষুব্ধ লোকেরা রিপোর্ট করতে শুরু করল যে এটি কাজ করে তবে অদ্ভুত জিনিসগুলি ঘটতে পারে, বা এটি কোনওভাবেই কাজ করে না, তাই এটি একটি সময়ের জন্য ক্রুদ্ধভাবে অবনমিত হয়েছিল। এমন মজা।
সমাধানটি আপনার সিস্টেমে ফাইল বর্ণনাকারীদের যথাযথ প্রয়োগের কাজে লাগায় এবং, কারণ প্রয়োগটি নিক্সের মধ্যে উল্লেখযোগ্যভাবে পরিবর্তিত হয়, এটির সাফল্য সম্পূর্ণরূপে সিস্টেম নির্ভর, স্থিরভাবে অ-বহনযোগ্য, এবং এমনকি অস্পষ্টভাবে গুরুত্বপূর্ণ কোনও কিছুর উপর নির্ভর করা উচিত নয়।
এখন, সমস্ত উপায় উত্তর ছাড়াই ছিল:
সেই ( exec 3<> yourfile
) লেখার পরে ফাইলটির জন্য অন্য একটি ফাইল বর্ণনাকারী তৈরি >&3
করা একই ফাইলের দ্বিধা নিয়ে পড়া / লেখাকে কাটিয়ে উঠবে বলে মনে হয়। অ্যাডাব্লিক সহ 600 কে ফাইলগুলিতে আমার জন্য কাজ করে। তবে 'বিড়াল' ব্যবহার করে একই কৌশল চেষ্টা করা ব্যর্থ।
অ্যাডকে ( -v TEXT="$text"
) এর পরিবর্তনশীল হিসাবে প্রিপেন্ডেজ পাস করা আক্ষরিক উক্তি সমস্যাটি কাটিয়ে ওঠে যা 'সেড' দিয়ে এই কৌশলটি করতে বাধা দেয়।
#!/bin/bash
text="Hello world
What's up?"
exec 3<> yourfile && awk -v TEXT="$text" 'BEGIN {print TEXT}{print}' yourfile >&3
এটি এখনও একটি টেম্প ফাইল ব্যবহার করে তবে কমপক্ষে এটি একটি লাইনে রয়েছে:
echo "text" | cat - yourfile > /tmp/out && mv /tmp/out yourfile
ক্রেডিট: বেস: একটি ফাইলের জন্য একটি পাঠ্য / লাইন প্রস্তুত করুন
-
এরপরে কি করছে cat
?
echo -n "text"
yourfile
একটি সিমিলিংক হয় তবে এটি যা চায় তা করবে না।
echo '0a
your text here
.
w' | ed some_file
এড স্ট্যান্ডার্ড এডিটর! http://www.gnu.org/fun/jokes/ed.msg.html
0r header.file
echo -e '0a\nyour text here\n.\nw' | ed some_file
জন মি: আপনার পদ্ধতিটি কাজের গ্যারান্টিযুক্ত নয়, এবং যদি আপনি 4096 বাইটের বেশি স্টাফ কিনে নেন তবে ব্যর্থ হবেন (কমপক্ষে এটি জিএনও অ্যাজকের সাথে ঘটেছিল তবে আমি মনে করি অন্যান্য বাস্তবায়নের ক্ষেত্রেও একই রকম প্রতিবন্ধকতা থাকবে)। এটি কেবল এটি ক্ষেত্রে ব্যর্থ হবে না, তবে এটি একটি অন্তহীন লুপে প্রবেশ করবে যেখানে এটি তার নিজস্ব আউটপুট পড়বে, যার ফলে সমস্ত উপলব্ধ স্থান পূরণ না হওয়া অবধি ফাইলটিকে বাড়ানো হবে।
এটি নিজের জন্য চেষ্টা করুন:
exec 3<>myfile && awk 'BEGIN{for(i=1;i<=1100;i++)print i}{print}' myfile >&3
(সতর্কতা: কিছুক্ষণ পরে এটি হত্যা করুন বা এটি ফাইল সিস্টেমটি পূরণ করবে)
তদুপরি, ফাইলগুলি সেভাবে সম্পাদনা করা খুব বিপজ্জনক, এবং এটি খুব খারাপ পরামর্শ, যেমন ফাইলটি সম্পাদনা করার সময় কিছু ঘটেছিল (ক্র্যাশ, ডিস্ক পূর্ণ) আপনি প্রায় অসন্তুষ্ট অবস্থায় ফাইলটি রেখে যাবেন বলে গ্যারান্টিযুক্ত।
একটি টেম্প ফাইল ছাড়া সম্ভব নয়, তবে এখানে অনলাইনার চলে
{ echo foo; cat oldfile; } > newfile && mv newfile oldfile
অস্থায়ী ফাইল ছাড়াই আপনি এড বা পার্লের মতো অন্যান্য সরঞ্জাম ব্যবহার করতে পারেন।
এটি লক্ষণীয় যে আপনি প্রায়শই এমকেটেম্পের মতো একটি ইউটিলিটি ব্যবহার করে অস্থায়ী ফাইলটি নিরাপদে তৈরি করা ভাল ধারণা , কমপক্ষে স্ক্রিপ্টটি যদি রুট সুবিধার সাথে কার্যকর করা হয়। উদাহরণস্বরূপ আপনি নিম্নলিখিতগুলি করতে পারেন (আবার ব্যাশে):
(tmpfile=`mktemp` && { echo "prepended text" | cat - yourfile > $tmpfile && mv $tmpfile yourfile; } )
আপনার নিয়ন্ত্রণ করা কম্পিউটারগুলিতে আপনার যদি এটির প্রয়োজন হয় তবে "মুর্টিলস" প্যাকেজটি ইনস্টল করুন এবং "স্পঞ্জ" ব্যবহার করুন। তারপরে আপনি এটি করতে পারেন:
cat header myfile | sponge myfile
{ echo "prepended text"; cat myfile } | sponge myfile
বাশ হেরডোক ব্যবহার করে আপনি একটি টিএমপি ফাইলের প্রয়োজনীয়তা এড়াতে পারেন:
cat <<-EOF > myfile
$(echo this is prepended)
$(cat myfile)
EOF
এটি কাজ করে কারণ red (বিড়াল মাইফাইল) যখন ব্যাশ স্ক্রিপ্ট মূল্যায়ন করা হয়, পুনর্নির্দেশ সহ বিড়ালটি কার্যকর করার আগে evalu
ধরে নিচ্ছি যে আপনি যে ফাইলটি সম্পাদনা করতে চান তা আমার টেক্সট
$cat my.txt
this is the regular file
এবং আপনি যে ফাইলটি প্রিপেন্ড করতে চান সেটি হ'ল হেডার
$ cat header
this is the header
হেডার ফাইলটিতে একটি চূড়ান্ত ফাঁকা রেখা আছে তা নিশ্চিত হয়ে নিন।
এখন আপনি এটি দিয়ে প্রেন্ডিং করতে পারেন
$cat header <(cat my.txt) > my.txt
আপনি শেষ
$ cat my.txt
this is the header
this is the regular file
আমি যতদূর জানি এটি কেবল 'বাশ' এ কাজ করে।
this is the header
টেক্সটে দুটি লাইন দিয়ে শেষ করেছি। এমনকি আমি বাশকে আপডেট করার পরেও আমি 4.3.42(1)-release
একই ফল পেয়েছি।
<(...)
) কমান্ডটি লিখেছে, সুতরাং সম্পূর্ণ আপ ফ্রন্টে পড়ার কোনও গ্যারান্টি নেইmy.txt
, যা ছাড়া এই কৌশলটি কাজ করবে না।
আপনি যখন শেল-স্ক্রিপ্টে কঠিন হয়ে ওঠার চেষ্টা শুরু করেন, তখন আমি "যথাযথ" স্ক্রিপ্টিং ভাষায় স্ক্রিপ্টটি পুনরায় লেখার জন্য দৃ strongly় পরামর্শ দেব (পাইথন / পার্ল / রুবি / ইত্যাদি)
কোনও ফাইলের জন্য একটি লাইন প্রিভেন্ডিংয়ের ক্ষেত্রে, পাইপিংয়ের মাধ্যমে এটি করা সম্ভব নয়, আপনি যখন যেমন কিছু করেন cat blah.txt | grep something > blah.txt
তবে অজান্তেই ফাইলটি ফাঁকা করে দেয়। sponge
আপনি ইনস্টল করতে পারবেন বলে একটি ছোট্ট ইউটিলিটি কমান্ড রয়েছে (আপনি এটি করেন cat blah.txt | grep something | sponge blah.txt
এবং এটি ফাইলের বিষয়বস্তুগুলিকে বাফার করে, তারপরে এটি ফাইলটিতে লিখে দেয়)। এটি একটি টেম্পল ফাইলের মতো তবে আপনার তা স্পষ্টভাবে করতে হবে না। তবে আমি বলব এটি পার্লের চেয়ে "খারাপ" প্রয়োজনীয়তা।
এটি awk, বা অনুরূপ মাধ্যমে করার একটি উপায় থাকতে পারে তবে আপনি যদি শেল-স্ক্রিপ্ট ব্যবহার করতে চান তবে আমার মনে হয় একটি টেম্প ফাইলটি সবচেয়ে সহজ (/ কেবল?) উপায় ..
ড্যানিয়েল ভেলকভের পরামর্শ মতো, টি ব্যবহার করুন।
আমার কাছে, এটি সহজ স্মার্ট সমাধান:
{ echo foo; cat bar; } | tee bar > /dev/null
সম্পাদনা: এটি ভেঙে গেছে। বিড়াল এবং টি সহ কোনও ফাইলের প্রিন্ট করার সময় অদ্ভুত আচরণ দেখুন
ওভাররাইট সমস্যাটির সমাধানটি ব্যবহার করছে tee
:
cat header main | tee main > /dev/null
আমি যেটি ব্যবহার করি। এটি আপনাকে অর্ডার, অতিরিক্ত অক্ষর ইত্যাদি আপনার পছন্দ মতো পদ্ধতিতে নির্দিষ্ট করার অনুমতি দেয়:
echo -e "TEXTFIRSt\n$(< header)\n$(< my.txt)" > my.txt
পিএস: কেবলমাত্র এটি কাজ করছে না যদি ফাইলগুলিতে ব্যাকস্ল্যাশযুক্ত পাঠ্য থাকে, কারণ এটি এড়িয়ে যাওয়ার অক্ষর হিসাবে ব্যাখ্যা করা হয়
বেশিরভাগ মজা / শেল গল্ফ জন্য, কিন্তু
ex -c '0r myheader|x' myfile
কৌশলটি করবে এবং কোনও পাইপলাইন বা পুনঃনির্দেশ নেই। অবশ্যই, vi / প্রাক্তন সত্যই নিরবচ্ছিন্ন ব্যবহারের জন্য নয়, তাই vi সংক্ষেপে ফ্ল্যাশ করবে।
কেন কেবল এড কমান্ডটি ব্যবহার করবেন না (যেমনটি ইতিমধ্যে এখানে ফুঁপানো দ্বারা প্রস্তাবিত)?
এড পুরো ফাইলটি মেমরিতে পড়ে এবং স্বয়ংক্রিয়ভাবে একটি স্থান-স্থান ফাইল সম্পাদনা করে!
সুতরাং, যদি আপনার ফাইলটি বিশাল না হয় ...
# cf. "Editing files with the ed text editor from scripts.",
# http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed
prepend() {
printf '%s\n' H 1i "${1}" . wq | ed -s "${2}"
}
echo 'Hello, world!' > myfile
prepend 'line to prepend' myfile
তবুও অন্য কাজটি হ'ল খোলা ফাইল হ্যান্ডলগুলি ব্যবহার করা হবে যেমন জর্জেন হিটজেল প্রস্তাবিত সেডের সি / সি / ডি / 'মাইফাইলে মাইফাইলে থেকে পুনঃনির্দেশ আউটপুটটিতে
echo cat > manipulate.txt
exec 3<manipulate.txt
# Prevent open file from being truncated:
rm manipulate.txt
sed 's/cat/dog/' <&3 > manipulate.txt
এই সব অবশ্যই একটি এক লাইনে রাখা যেতে পারে।
স্থির পাঠ্যটি পুনরায় চাপানোর জন্য "কোনও টেম্প ফাইল নয়" এর জন্য সিবি 0 এর সমাধানে একটি বৈকল্পিক:
echo "text to prepend" | cat - file_to_be_modified | ( cat > file_to_be_modified )
আবার এটি উপ-শেল প্রয়োগের উপর নির্ভর করে - (..) - বিড়ালটিকে ইনপুট এবং আউটপুট জন্য একই ফাইল রাখতে অস্বীকার করে।
দ্রষ্টব্য: এই সমাধানটি পছন্দ করেছেন। যাইহোক, আমার ম্যাকের মূল ফাইলটি হারিয়ে গেছে (ভেবেছিল এটি করা উচিত নয় তবে এটি হয়)। এটি আপনার সমাধান হিসাবে লিখে সমাধান করা যেতে পারে: প্রতিধ্বনি "প্রিপেন্ড করতে পাঠ্য" | বিড়াল - file_to_be_ Modified | বিড়াল> tmp_file; mv tmp_file file_to_be_ Modified
আমি যা আবিষ্কার করেছি তা এখানে:
echo -e "header \n$(cat file)" >file
সতর্কতা: অপির প্রয়োজন মেটাতে এর জন্য আরও কিছুটা কাজ করা দরকার।
@ শিক্সিলুন তার কুফলগুলি সত্ত্বেও কাজ করে সেড অ্যাপ্রোচ করার উপায় আছে। একটি বিকল্প পংক্তিতে কোনও ফাইল পড়ার সময় অবশ্যই সাদা স্থান থেকে বাঁচতে একটি বাশ কমান্ড থাকতে হবে (যেমন '\ n' দিয়ে নিউলাইন চরিত্রগুলি প্রতিস্থাপন করুন ll শেল কমান্ডগুলি vis
এবং cat
অ-মুদ্রণযোগ্য অক্ষরগুলির সাথে ডিল করতে পারে তবে হোয়াইটস্পেস নয়, সুতরাং এটি অপের সমাধান করবে না সমস্যা:
sed -i -e "1s/^/$(cat file_with_header.txt)/" file_to_be_prepended.txt
বিকল্প স্ক্রিপ্টে কাঁচা নিউলাইনগুলির কারণে ব্যর্থ হয়, যা একটি লাইন ধারাবাহিকতা অক্ষর () দিয়ে চালিত করা প্রয়োজন এবং সম্ভবত একটি & এর পরে, শেল এবং সুখী রাখতে, এই এসও উত্তরের মত
sed
অ-বৈশ্বিক অনুসন্ধান-প্রতিস্থাপন কমান্ডগুলির জন্য 40K এর আকারের সীমা রয়েছে (প্যাটার্নের পরে কোনও পিছনে / ছ নয়) সুতরাং বেনামে সতর্ক হওয়া সতর্কতার মতো ভীতিজনক বাফার ওভাররন সমস্যাগুলি এড়াতে পারে।
sed -i -e "1s/^/new first line\n/" old_file.txt
এর সাথে একটি সমাধান printf
:
new_line='the line you want to add'
target_file='/file you/want to/write to'
printf "%s\n$(cat ${target_file})" "${new_line}" > "${target_file}"
আপনি এছাড়াও করতে পারেন:
printf "${new_line}\n$(cat ${target_file})" > "${target_file}"
তবে সেই ক্ষেত্রে আপনার অবশ্যই নিশ্চিত হতে হবে যে %
লক্ষ্য ফাইলের বিষয়বস্তু সহ কোনও কোথাও নেই, কারণ এটি ব্যাখ্যা করতে পারে এবং আপনার ফলাফলগুলি স্ক্রু করতে পারে।
echo
একটি নিরাপদ বিকল্প মত মনে হচ্ছে। echo "my new line\n$(cat my/file.txt)" > my/file.txt
${new_line}
লক্ষ্য ফাইলটি নয়, প্রবেশাধিকার সম্পর্কে সতর্ক করেছিলেন
আপনি পার্ল কমান্ড লাইন ব্যবহার করতে পারেন:
perl -i -0777 -pe 's/^/my_header/' tmp
যেখানে -i ফাইলটির একটি ইনলাইন প্রতিস্থাপন তৈরি করবে এবং -0777 পুরো ফাইলটি স্লার্প করবে এবং কেবল ম্যাচটি শুরু করবে। -pe সমস্ত লাইন মুদ্রণ করবে
অথবা যদি my_header ফাইল হয়:
perl -i -0777 -pe 's/^/`cat my_header`/e' tmp
যেখানে / ই বিকল্পের ক্ষেত্রে কোড বিলোপের অনুমতি দেবে।
আমি @ ফ্লফলের এড পদ্ধতির পছন্দ করছি । সর্বোপরি, যে কোনও সরঞ্জামের কমান্ড লাইন স্যুইচ বনাম স্ক্রিপ্টযুক্ত সম্পাদক কমান্ডগুলি মূলত এখানে একই জিনিস; কোনও স্ক্রিপ্টযুক্ত সম্পাদক সমাধান "পরিষ্কারতা" কোনও কম বা কী নন তা দেখছেন না।
বার্তাটি দেওয়ার .git/hooks/prepare-commit-msg
জন্য একটি ইন-রেপো .gitmessage
ফাইলটি পুনরায় সংশোধন করতে আমার ওয়ান-লাইনার যুক্ত হয়েছে :
echo -e "1r $PWD/.gitmessage\n.\nw" | ed -s "$1"
উদাহরণ .gitmessage
:
# Commit message formatting samples:
# runlevels: boot +consolekit -zfs-fuse
#
আমি এর 1r
পরিবর্তে করছি 0r
, কারণ এটি মূল টেমপ্লেট থেকে খালি রেডি-তে-লেখার ফাইলটি ফাইলের উপরে ছেড়ে যাবে। .gitmessage
তারপরে খালি লাইন রাখবেন না , আপনি দুটি খালি লাইন দিয়ে শেষ করবেন। -s
এডের ডায়গনিস্টিক তথ্য আউটপুট দমন করে।
এটির সাথে যাওয়ার প্রসঙ্গে আমি আবিষ্কার করেছি যে ভিম-বাফের জন্য এটি থাকাও ভাল:
[core]
editor = vim -c ':normal gg'
আমি মনে করি এটি এডের সবচেয়ে পরিষ্কার প্রকরণ:
cat myheader | { echo '0a'; cat ; echo -e ".\nw";} | ed myfile
একটি ফাংশন হিসাবে:
function prepend() { { echo '0a'; cat ; echo -e ".\nw";} | ed $1; }
cat myheader | prepend myfile
আপনি যদি BASH এ স্ক্রিপ্ট করছেন, আসলে, আপনি কেবল জারি করতে পারেন:
বিড়াল - yourfile / tmp / আউট এবং & এমভি / tmp / আউট আপনার ফাইল
এটি আসলে আপনার নিজের প্রশ্নে পোস্ট করা জটিল উদাহরণে।
cat - yourfile <<<"text" > /tmp/out && mv /tmp/out yourfile
, তবে এটি আমার উত্তর থেকে যথেষ্ট পৃথক যে এটি নিজের উত্তর হওয়া উচিত।
এই প্রোগ্রামটিতে কোন শেল সমাধান (এবং কখনও এক হতে হবে) যে ধারাবাহিকভাবে এবং নির্ভরযোগ্যভাবে যাই হোক না কেন দুই ফাইলের মাপ কাজ করবে myheader
এবং myfile
। কারণটি হ'ল যদি আপনি এটি করতে চান তবে অস্থায়ী ফাইলটিতে পুনরাবৃত্তি না করে (এবং শেলটি নিঃশব্দে কোনও অস্থায়ী ফাইলটিতে পুনরায় না ঘটাতে দেওয়া হয়, যেমন: নির্মাণের মাধ্যমে exec 3<>myfile
, পাইপিং করা tee
ইত্যাদি) to
আপনি যে "আসল" সমাধানটির সন্ধান করছেন তা ফাইল সিস্টেমের সাথে ঝাঁকুনির জন্য প্রয়োজন, এবং তাই এটি ইউজারস্পেসে উপলভ্য নয় এবং এটি প্ল্যাটফর্ম নির্ভর dependent নির্ভরতা: আপনি ফাইল সিস্টেমের পয়েন্টারের myfile
বর্তমান মান অনুসারে ফাইল সিস্টেম পয়েন্টারটি পরিবর্তন করতে বলছেন জন্য myheader
এবং ফাইলসিস্টেম প্রতিস্থাপন EOF
এর myheader
বর্তমান ফাইলসিস্টেম ঠিকানায় একটি শৃঙ্খলিত লিঙ্ক সহ দ্বারা ইশারাmyfile
। এটি তুচ্ছ নয় এবং স্পষ্টতই কোনও অ-সুপারইউজার ব্যবহারকারীর দ্বারা করা সম্ভব নয় এবং সম্ভবত সুপারভাইজারের দ্বারাও হয় না ... আইওনড সহ খেলুন ইত্যাদি
যদিও আপনি লুপ ডিভাইসগুলি ব্যবহার করে এটি কমবেশি জাল করতে পারেন। উদাহরণস্বরূপ দেখুন এই তাই থ্রেড ।
mktemp
? আপনি তারপরে সর্বদা টেম্প ফাইলটি সাফ করতে পারেন ...