man
পৃষ্ঠা আমাকে অনেক আশা দেয় না, কিন্তু আমি এটা একটি অনথিভুক্ত (এবং / অথবা গনুহ-নির্দিষ্ট) বৈশিষ্ট্য এর আশা করছি।
man
পৃষ্ঠা আমাকে অনেক আশা দেয় না, কিন্তু আমি এটা একটি অনথিভুক্ত (এবং / অথবা গনুহ-নির্দিষ্ট) বৈশিষ্ট্য এর আশা করছি।
উত্তর:
আপনি পারবেন না। হয় এড বা জিএনইউ সেড বা পার্ল ব্যবহার করুন বা পর্দার আড়ালে তারা যা করেন তা করুন, যা বিষয়বস্তুগুলির জন্য একটি নতুন ফাইল তৈরি করা।
ed
, সুবহ:
ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOF
জিএনইউ sed
:
sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' foo
পার্ল:
perl -i -l -F, -pae 'print @F[1,3]' foo
cut
, একটি নতুন ফাইল তৈরি করা (প্রস্তাবিত, কারণ যদি আপনার স্ক্রিপ্টটি বাধা দেয় তবে আপনি কেবল এটি আবার চালাতে পারেন):
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foo
cut
ফাইলটি প্রতিস্থাপিত করে (মালিকানার মালিকানা এবং অনুমতিগুলি রাখে foo
তবে বাধাগুলির বিরুদ্ধে সুরক্ষা প্রয়োজন):
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.old
আমি cut
বেসড পদ্ধতিগুলির মধ্যে একটি ব্যবহার করার পরামর্শ দিচ্ছি । এইভাবে আপনি কোনও অ-মানক সরঞ্জামের উপর নির্ভর করেন না, আপনি কাজের জন্য সেরা সরঞ্জামটি ব্যবহার করতে পারেন এবং আপনি বাধা দেওয়ার উপর আচরণটি নিয়ন্ত্রণ করতে পারেন।
cut -d , -f 1,3 foo > foo.new
rm foo
mv foo.new foo
rm foo
। এবং আপনার কল করা উচিত নয় rm foo
, কারণ mv foo.new foo
এটি পারমাণবিক: এটি পুরানো সংস্করণটি সরিয়ে দেয় এবং একই সাথে নতুন সংস্করণটি স্থাপন করে।
Moreutils উবুন্টু (এবং থেকে প্যাকেজ ডেবিয়ান ) নামক একটি প্রোগ্রাম আছে sponge
, যা সাজানোর অফ এছাড়াও আপনার সমস্যা solves।
ম্যান স্পঞ্জ থেকে:
স্পঞ্জ স্ট্যান্ডার্ড ইনপুট পড়ে এবং নির্দিষ্ট ফাইলে এটি লিখে দেয়। শেল পুনর্নির্দেশের বিপরীতে, স্পঞ্জ আউটপুট ফাইল খোলার আগে তার সমস্ত ইনপুট আপ করে তুলে। এটি একই ফাইল থেকে পড়া এবং লেখার জন্য সঙ্কলিত পাইপলাইনগুলিকে অনুমতি দেয়।
যা আপনাকে এমন কিছু করতে দেয়:
cut -d <delim> -f <fields> somefile | sponge somefile
আমি cut
একা ব্যবহার করা সম্ভব বলে মনে করি না। আমি এটি মানুষ বা তথ্য পৃষ্ঠায় খুঁজে পাইনি। আপনি যেমন কিছু করতে পারেন
mytemp=$(mktemp) && cut -d" " -f1 file > $mytemp && mv $mytemp file
mktemp
আপনাকে তুলনামূলকভাবে নিরাপদ অস্থায়ী ফাইল তৈরি করে যা আপনি cut
আউটপুটটি পাইপ করতে পারেন ।
আপনি পসিএক্স আওক দিয়ে স্লুর্প ব্যবহার করতে পারেন:
cut -b1 file | awk 'BEGIN{RS="";getline<"-";print>ARGV[1]}' file
ঠিক আছে, যেহেতু cut
এটি পড়ার চেয়ে কম আউটপুট উত্পাদন করে তাই আপনি এটি করতে পারেন:
cut -c1 < file 1<> file
এটি হ'ল, তার স্টিডিনটিকে file
কেবল পঠনযোগ্য মোডে file
ওপেন করুন এবং তার স্ট্যান্ডআউটটি কাটা ছাড়াই (কেবল <>
) মোডে রিড + রাইট মোডে উন্মুক্ত করুন ।
এইভাবে, cut
কেবল নিজের উপরের ফাইলটি ওভাররাইট করবে। যাইহোক, এটি ফাইলটির বাকী অংশটি ছোঁয়া ছেড়ে দেবে। উদাহরণস্বরূপ, যদি file
এতে থাকে:
foo
bar
আউটপুট হয়ে যাবে:
f
b
bar
f\nb\n
প্রতিস্থাপিত আছে foo\n
কিন্তু bar
এখনও আছে। ফাইলটি cut
শেষ করার পরে আপনাকে কেটে ফেলতে হবে ।
এর সাহায্যে ksh93
আপনি এটির <>;
অপারেটর দিয়ে এটি করতে পারেন যা <>
কমান্ডটি সফল ftruncate()
হলে ফাইল বিবরণীতে কল করা ছাড়া এটির মতো কাজ করে। তাই:
cut -c1 < file 1<>; file
অন্যান্য শেলগুলির সাহায্যে আপনার ftruncate()
কিছু অন্যান্য উপায়ের মাধ্যমে করতে হবে :
{ cut -c1 < file; perl -e 'truncate STDOUT, tell STDOUT';} 1<> file
যদিও এর perl
জন্য কেবল অনুরোধ করা এখানে কিছুটা ওভারকিল, বিশেষত বিবেচনা করে যে perl
সেই cut
কাজটি সহজেই করতে পারে :
perl -pi -e '$_ = substr($_, 0, 1)' file
সতর্ক থাকুন যে সমস্ত পদ্ধতিতে প্রকৃত ইন-প্লেস রাইটিংয়ে জড়িত, যদি অপারেশন মাঝপথে বিঘ্নিত হয় তবে আপনি একটি দূষিত ফাইলটি শেষ করবেন। একটি অস্থায়ী দ্বিতীয় ফাইল ব্যবহার করা এই সমস্যা এড়ায়।
.old
ইন-প্লেস পরিবর্তনের জন্য পদ্ধতির চেয়ে ভালecho "$(cut -d , -f 1,3 <foo)" > foo