কোনও পাঠ্য ফাইলে কিছু স্ট্রিং ডেটা প্রিপেন্ড করার জন্য কি ইউনিক্স কমান্ড রয়েছে?
কিছুটা এইরকম:
prepend "to be prepended" text.txt
<<(echo "to be prepended") < text.txt | sponge text.txt
কোনও পাঠ্য ফাইলে কিছু স্ট্রিং ডেটা প্রিপেন্ড করার জন্য কি ইউনিক্স কমান্ড রয়েছে?
কিছুটা এইরকম:
prepend "to be prepended" text.txt
<<(echo "to be prepended") < text.txt | sponge text.txt
উত্তর:
sed -i.old '1s;^;to be prepended;' inFile
-i
পরিবর্তনের জায়গায় লিখুন এবং কোনও এক্সটেনশন দেওয়া থাকলে ব্যাকআপ নিন। (এই ক্ষেত্রে, .old
)1s;^;to be prepended;
;
কমান্ড ডিলিমিটার হিসাবে ব্যবহার করে প্রদত্ত প্রতিস্থাপনের স্ট্রিংয়ের মাধ্যমে প্রথম লাইনের শুরুটি প্রতিস্থাপন করে ।\n
প্রিপেন্ডের পরে sertোকাতে চাইবে ; তাদের প্রয়োজন উপর নির্ভর করে। ঝরঝরে সমাধান।
inFile
এর পথের মধ্যে ডিরেক্টরিগুলি অন্তর্ভুক্ত করা যাবে ?
\n
। মন্তব্যগুলি আগে পড়া উচিত ছিল। অভিশাপ।
'1s;^;my-prepended-line\;\n;'
printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt
git config --get-regex $arg | sed -r 's/\t{3}/\\n/g';
এটি ছিল \t
এবং এটি রূপান্তরিত হওয়ার সাথে সাথে এটি মুছে যায় \n
।
echo "to be prepended"$'\n'"$(cat text.txt)"
আমি অবাক হয়েছি কেউ এর উল্লেখ করেনি।
cat <(echo "before") text.txt > newfile.txt
যা গ্রহণযোগ্য উত্তরের চেয়ে যুক্তিযুক্তভাবে বেশি প্রাকৃতিক (কোনও কিছু মুদ্রণ করে এটিকে প্রতিস্থাপনের কমান্ডে পাইপ করা হচ্ছে শব্দতাত্ত্বিকভাবে পাল্টা স্বজ্ঞাত)।
... এবং রায়ান উপরে যা বলেছিল তা হাইজ্যাক করে sponge
আপনার সাথে একটি অস্থায়ী ফাইলের প্রয়োজন নেই:
sudo apt-get install moreutils
<<(echo "to be prepended") < text.txt | sponge text.txt
সম্পাদনা: দেখে মনে হচ্ছে বোর্ন শেলে এটি কাজ করে না /bin/sh
এখানে একটি স্ট্রিং ব্যবহার করে - <<<
আপনি করতে পারেন:
<<< "to be prepended" < text.txt | sponge text.txt
<<(echo "to be prepended") < text.txt
এবং <<< "to be prepended" < text.txt
নির্মাণগুলি ব্যাশে কাজ করে না; তাদের zsh প্রয়োজন।
এটি একটি সম্ভাবনা:
(echo "to be prepended"; cat text.txt) > newfile.txt
আপনি সম্ভবত কোনও মধ্যবর্তী ফাইল সহজেই পাবেন না।
বিকল্প (শেল পলায়নের জন্য জটিল হতে পারে):
sed -i '0,/^/s//to be prepended/' text.txt
cat <(echo "to be prepended") text.txt > newfile.txt
। এটি ভাবতে আসুন, আমি নিশ্চিত যে আমার সম্পর্কিত কিনা তাই আমি আলাদা উত্তর পোস্ট করছি।
এটি আউটপুট গঠনে কাজ করবে। - - এর অর্থ স্ট্যান্ডার্ড ইনপুট, যা ইকো থেকে পাইপের মাধ্যমে সরবরাহ করা হয়।
echo -e "to be prepended \n another line" | cat - text.txt
ফাইলটি পুনরায় লেখার জন্য একটি অস্থায়ী ফাইল প্রয়োজন যা ইনপুট ফাইলটিতে ফিরে পাইপ করতে পারে না।
echo "to be prepended" | cat - text.txt > text.txt.tmp
mv text.txt.tmp text.txt
text.txt
অনুরোধ করা সত্ত্বেও ফাইলটিতে পাঠ্যটি প্রিপেন্ড করে না , তবে এটি স্টডআউটে প্রদর্শন করে। যদি ওপি
আদমের উত্তর পছন্দ করুন
আমরা স্পঞ্জ ব্যবহার করা সহজ করে তুলতে পারি । এখন আমাদের একটি অস্থায়ী ফাইল তৈরি করে এটির নতুন নামকরণের দরকার নেই
echo -e "to be prepended \n another line" | cat - text.txt | sponge text.txt
বিঃদ্রঃ:
এটি করার ফলে অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া হতে পারে, উল্লেখযোগ্যভাবে একটি নিয়মিত ফাইলের সাথে একটি সিমিলিংক প্রতিস্থাপন করা, ফাইলে বিভিন্ন অনুমতি নিয়ে শেষ হওয়া এবং ফাইলের তৈরির (জন্মের) তারিখ পরিবর্তন করা।
sed -i
প্রিন্স জন ওয়েসলির উত্তরে যেমন অন্ততপক্ষে মূল অনুমতিগুলি পুনরুদ্ধার করার চেষ্টা করা হয়, তবে অন্যান্য সীমাবদ্ধতাগুলিও প্রযোজ্য।
এখানে একটি সহজ বিকল্প যা একটি অস্থায়ী ফাইল ব্যবহার করে (এটি শিমের সমাধান যেমন করে মেমোরিতে পুরো ইনপুট ফাইলটি পড়া এড়াতে পারে):
{ printf 'to be prepended'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt
একটি ব্যবহার গ্রুপ কমান্ড ( { ...; ...; }
) একটি ব্যবহার তুলনায় সামান্য বেশি কার্যকরী subshell ( (...; ...)
,) হিসাবে 0xC0000022L এর সমাধান ।
সুবিধাগুলি হ'ল:
নতুন পাঠ্যটি সরাসরি প্রথম লাইনে সরাসরি যুক্ত করা উচিত কিনা বা এটি নতুন লাইন (গুলি) হিসাবে সন্নিবেশ করা উচিত (কেবল যুক্তির সাথে সংযোজন \n
করা উচিত printf
) এটি নিয়ন্ত্রণ করা সহজ।
sed
সমাধানের বিপরীতে , ইনপুট ফাইলটি খালি ( 0
বাইট) থাকলে এটি কাজ করে ।
sed
সমাধান যদি অভিপ্রায় এক বা একাধিক পূর্বে লিখুন হয় সরলীকৃত করা যেতে পারে পুরো লাইন বিদ্যমান সামগ্রী করার জন্য (অভিমানী ইনপুট ফাইল অ খালি):
sed
এর i
ফাংশন পুরো লাইনগুলি সন্নিবেশ করায়:
সঙ্গে গনুহ sed
:
# Prepends 'to be prepended' *followed by a newline*, i.e. inserts a new line.
# To prepend multiple lines, use '\n' as part of the text.
# -i.old creates a backup of the input file with extension '.old'
sed -i.old '1 i\to be prepended' inFile
একটি পোর্টেবল বৈকল্পিক যা ম্যাকোস / বিএসডি এর সাথেও কাজ করে sed
:
# Prepends 'to be prepended' *followed by a newline*
# To prepend multiple lines, escape the ends of intermediate
# lines with '\'
sed -i.old -e '1 i\
to be prepended' inFile
নোট করুন যে \
প্রয়োজন পরে আক্ষরিক নিউলাইন ।
সম্মানজনক ed
POSIX ইউটিলিটি ব্যবহার করে :
বিঃদ্রঃ:
ed
সর্বদা ইনপুট ফাইলটি সম্পূর্ণ মেমরির মধ্যে পড়ে।সরাসরি প্রথম লাইনে प्रीপেন্ড করতে (যেমন হিসাবে sed
, ইনপুট ফাইলটি সম্পূর্ণ খালি ( 0
বাইট)) থাকলে এটি কাজ করবে না :
ed -s text.txt <<EOF
1 s/^/to be prepended/
w
EOF
-s
দমন করা ed
স্থিতি বার্তা।ed
মাল্টি-লাইন -ডকুমেন্ট ( <<EOF\n...\nEOF
) হিসাবে স্ট্যান্ডিনের মাধ্যমে সরবরাহ করা হবে ; ডিফল্টরূপে স্ট্রিং সম্প্রসারণ করা হয় (শেল ভেরিয়েবল ইন্টারপোলেট করা হয়) যেমন নথি সঞ্চালিত; দমন করতে উদ্বোধনী ডিলিমিটারটি উদ্ধৃত করুন (যেমন, <<'EOF'
)।1
1 ম লাইনটিকে বর্তমান রেখা তৈরি করেs
বর্তমান লাইনে একটি রেজেক্স-ভিত্তিক স্ট্রিং প্রতিস্থাপন সম্পাদন করে sed
; আপনি প্রতিস্থাপন পাঠ্যে আক্ষরিক\
নিউলাইনগুলি অন্তর্ভুক্ত করতে পারেন তবে সেগুলি অবশ্যই আটকানো হবে।w
ফলাফলটি ইনপুট ফাইলটিতে ফিরে আসে (পরীক্ষার জন্য, ইনপুট ফাইলটি পরিবর্তন না করে কেবল ফলাফল মুদ্রণের জন্য প্রতিস্থাপন w
করে )।,p
করতে এক বা একাধিক পূর্বে লিখুন পুরো লাইন :
যেমনটি হিসাবে sed
, i
ফাংশনটি ablyোকানোর জন্য পাঠ্যটিতে অবিচ্ছিন্নভাবে একটি নতুন পেজ যুক্ত করে।
ed -s text.txt <<EOF
0 i
line 1
line 2
.
w
EOF
0 i
তোলে 0
(ফাইল শুরুতেই) বর্তমান লাইন এবং মোড সন্নিবেশ শুরু হয়েছে ( i
); নোট করুন যে লাইন নম্বরগুলি অন্যথায়- 1
ভিত্তিক।.
তার নিজস্ব লাইনে সমাপ্ত হয় ।সম্ভবত অন্তর্নির্মিত কিছুই না, তবে আপনি নিজের সহজেই লিখতে পারেন, এটির মতো:
#!/bin/bash
echo -n "$1" > /tmp/tmpfile.$$
cat "$2" >> /tmp/tmpfile.$$
mv /tmp/tmpfile.$$ "$2"
অন্তত এমন কিছু ...
$$
উত্পাদন কোডের জন্য ব্যবহার অপ্রতুল, যদিও (গুগল সিমলিংক আক্রমণ); তবে এটি অবশ্যই একটি স্থির ফাইলের নামের চেয়ে ভাল।
mktemp
কিছু পরিস্থিতিতে প্রিপেন্ড করা পাঠ্য কেবল স্টিডিন থেকে পাওয়া যায়। তাহলে এই সমন্বয়টি কাজ করবে।
echo "to be prepended" | cat - text.txt | tee text.txt
আপনি যদি tee
আউটপুট বাদ দিতে চান তবে যুক্ত করুন > /dev/null
।
tee
কোঁকড়ে না পড়ে? আমি মনে করি না - যা এই সমাধানটি ফাইলের স্বাস্থ্যের পক্ষে বিপজ্জনক করে তুলবে। text.txt
cat
lenA=1000000; yes a | head -c $lenA > a.txt; lenB=10000; b=$(yes b | head -c $lenB); echo "$b" | cat - a.txt | tee a.txt > /dev/null
। যদি lenA
1000000 (1 এমবি ফাইল) হয় এবং lenB
এটি 10000 (10 কেবি টেক্সট প্রিপেন্ড) হয়, তবে "a.txt" ফাইলটি "বি" অক্ষরের 20 কেবি দিয়ে ওভাররাইট করা হয়। এটি পুরোপুরি ভাঙা। এখন, আপনি যদি প্রেন্ডেন্ড করতে 1Mb a.txt এবং 1Mb টেক্সট ব্যবহার করেন, 7 tee
জিবি + ফাইল তৈরির লুপে যান, আমাকে কমান্ডটি থামাতে হবে। সুতরাং, এটি সুস্পষ্ট যে ফলাফলটি বৃহত আকারের জন্য অনাকাঙ্ক্ষিত। এটি ছোট আকারে কাজ করা উচিত কিনা আমার কোনও তথ্য নেই।
সমাধান:
printf '%s\n%s' 'text to prepend' "$(cat file.txt)" > file.txt
মনে রাখবেন যে এটি সমস্ত ধরণের ইনপুটগুলিতে নিরাপদ, কারণ কোনও বিস্তৃতি নেই। উদাহরণস্বরূপ, আপনি যদি অর্থ পরিশোধ করতে চান তবে !@#$%^&*()ugly text\n\t\n
এটি কেবল কাজ করবে:
printf '%s\n%s' '!@#$%^&*()ugly text\n\t\n' "$(cat file.txt)" > file.txt
বিবেচনার জন্য বাকি অংশটি কমান্ড প্রতিস্থাপনের সময় ফাইলের শেষে সাদা স্থান অপসারণ "$(cat file.txt)"
। এর জন্য সমস্ত কাজের ক্ষেত্র তুলনামূলকভাবে জটিল। আপনি যদি file.txt এর শেষে নতুন লাইনের সংরক্ষণ করতে চান তবে এটি দেখুন: https://stackoverflow.com/a/22607352/1091436
file.txt
চেয়ে আর্গুমেন্ট প্রাপ্ত করতে তালিকায় লাগানো যেতে পারে বড় printf
।
আর একটি উপায় ব্যবহার করে sed
:
sed -i.old '1 {i to be prepended
}' inFile
যদি রেপেন্ট করা উচিত লাইনটি মাল্টিলাইন হয়:
sed -i.old '1 {i\
to be prepended\
multiline
}' inFile
sed -i '1ito be prepended' inFile
- বা এটি কেবল জিএনইউ সেডের জন্য অনুমোদিত?
sed
, i
কমান্ডটি একটি ব্যাকস্ল্যাশ এবং একটি নতুন লাইন অনুসরণ করে এবং ইনপুট প্রতিটি লাইন ব্যাকস্ল্যাশ সহ শেষ প্রান্ত ব্যতীত হয়। sed
আপনার সম্পর্কে জিজ্ঞাসা করা লাইনের পাশাপাশি জিএনইউ শর্টহ্যান্ডগুলি অনুমতি দেয় তবে এটি কেবল জিএনইউই sed
করে। '
যেমন বাশে পরীক্ষিত (উবুন্টুতে), যদি কোনও পরীক্ষার ফাইল দিয়ে শুরু করে;
echo "Original Line" > test_file.txt
আপনি মৃত্যুদণ্ড কার্যকর করতে পারেন;
echo "$(echo "New Line"; cat test_file.txt)" > test_file.txt
বা, যদি বাশের সংস্করণটি $ () এর জন্য খুব পুরানো হয় তবে আপনি ব্যাকটিক্স ব্যবহার করতে পারেন;
echo "`echo "New Line"; cat test_file.txt`" > test_file.txt
এবং "test_file.txt" এর নিম্নলিখিত বিষয়বস্তুগুলি পান;
New Line
Original Line
কোনও মধ্যস্থতাকারী ফাইল নেই, কেবল বাশ / প্রতিধ্বনি।
আরেকটি মোটামুটি সোজা ফরোয়ার্ড সমাধান হ'ল:
$ echo -e "string\n" $(cat file)
cat
উদ্ধৃতি চিহ্ন মধ্যে পরামিতি সম্প্রসারণ একটি জন্য একটি প্রশংসনীয় ভাল কারণ নেই downvote । এই কোডটি ফাইলের বিষয়বস্তুগুলিকে শব্দগুলিতে বিভক্ত করছে এবং সেই শব্দের প্রত্যেককে পৃথক যুক্তি হিসাবে পাস করছে echo
। আপনি মূল যুক্তি গণ্ডি হারান, আপনি হারান নতুন লাইন / ট্যাব / ইত্যাদি। এবং অন্য কোনো স্ট্রিং \t
এবং \n
মূল পাঠে ট্যাব এবং নতুন লাইন পরিবর্তে যেমন তারা রাখা হচ্ছে দিয়ে প্রতিস্থাপিত করা হয়।
আপনি যদি vi / vim পছন্দ করেন তবে এটি আপনার স্টাইলটি আরও বেশি হতে পারে।
printf '0i\n%s\n.\nwq\n' prepend-text | ed file
আমি কোনও ফাংশন সংজ্ঞায়িত করার এবং তারপরে আমদানি এবং যেখানে প্রয়োজন সেখানে ব্যবহার করার পরামর্শ দেব।
prepend_to_file() {
file=$1
text=$2
if ! [[ -f $file ]] then
touch $file
fi
echo "$text" | cat - $file > $file.new
mv -f $file.new $file
}
তারপরে এটির মতো ব্যবহার করুন:
prepend_to_file test.txt "This is first"
prepend_to_file test.txt "This is second"
আপনার ফাইলের সামগ্রীগুলি তখন তা হবে:
This is second
This is first
আমি পরিবর্তন লগ আপডেটের প্রয়োগের জন্য এই পদ্ধতির ব্যবহার করতে চলেছি।