আমি কি জায়গায় একটি ফাইল পরিবর্তন করতে "কাট" করতে পারি?


উত্তর:


14

আপনি পারবেন না। হয় এড বা জিএনইউ সেড বা পার্ল ব্যবহার করুন বা পর্দার আড়ালে তারা যা করেন তা করুন, যা বিষয়বস্তুগুলির জন্য একটি নতুন ফাইল তৈরি করা।

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বেসড পদ্ধতিগুলির মধ্যে একটি ব্যবহার করার পরামর্শ দিচ্ছি । এইভাবে আপনি কোনও অ-মানক সরঞ্জামের উপর নির্ভর করেন না, আপনি কাজের জন্য সেরা সরঞ্জামটি ব্যবহার করতে পারেন এবং আপনি বাধা দেওয়ার উপর আচরণটি নিয়ন্ত্রণ করতে পারেন।


.oldইন-প্লেস পরিবর্তনের জন্য পদ্ধতির চেয়ে ভালecho "$(cut -d , -f 1,3 <foo)" > foo
জিপসিকোসমোনট

1
@ জিপসিকোসমোনট না, এটি "আরও ভাল" নয়। এটা আরও ভঙ্গুর। এর একমাত্র সুবিধা হ'ল এটি টাইপ করা ছোট। আপনার পদ্ধতির মূল সমস্যাটি হ'ল যদি ইনপুট ফাইলটি প্রক্রিয়াকরণ করার সময় বা আউটপুট লেখার সময় কোনও ত্রুটি ঘটে থাকে তবে ডেটা হারিয়ে যায়। এটি বাইনারি ডেটা নিয়েও কাজ করে না: প্রথম নাল বাইটে আউটপুট কেটে যাবে। এমনকি পাঠ্য ফাইল সহ এটি ফাইলের শেষ থেকে খালি লাইনগুলি সরিয়ে দেয়। বড় ফাইলগুলির সাথে এটি ব্যর্থ হতে পারে কারণ ডেটা শেলের স্মৃতিতে স্ট্রিং হিসাবে সংরক্ষণ করতে হয় (এবং মনে রাখবেন, যদি এটি ঘটে তবে ডেটাটি হারিয়ে যায়)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

ওহ ধন্যবাদ, আমি জানতাম না নাল বাইটে সমস্যা হতে পারে
জিপসিকোসমোনট

আমি মনে করি এটি সহজ:cut -d , -f 1,3 foo > foo.new rm foo mv foo.new foo
LoMaPh

@ লোমাপ্প প্রকৃতপক্ষে, আমি জানি না কেন আমি পুরানো ফাইলটির নামকরণ করেছি: নতুন ফাইলটির নামকরণের সাথে এর কোনও সুবিধা নেই। এটি আরও সহজ কারণ আপনার এই পদক্ষেপের প্রয়োজন নেই rm foo। এবং আপনার কল করা উচিত নয় rm foo, কারণ mv foo.new fooএটি পারমাণবিক: এটি পুরানো সংস্করণটি সরিয়ে দেয় এবং একই সাথে নতুন সংস্করণটি স্থাপন করে।
গিলস

23

Moreutils উবুন্টু (এবং থেকে প্যাকেজ ডেবিয়ান ) নামক একটি প্রোগ্রাম আছে sponge, যা সাজানোর অফ এছাড়াও আপনার সমস্যা solves।

ম্যান স্পঞ্জ থেকে:

স্পঞ্জ স্ট্যান্ডার্ড ইনপুট পড়ে এবং নির্দিষ্ট ফাইলে এটি লিখে দেয়। শেল পুনর্নির্দেশের বিপরীতে, স্পঞ্জ আউটপুট ফাইল খোলার আগে তার সমস্ত ইনপুট আপ করে তুলে। এটি একই ফাইল থেকে পড়া এবং লেখার জন্য সঙ্কলিত পাইপলাইনগুলিকে অনুমতি দেয়।

যা আপনাকে এমন কিছু করতে দেয়:

cut -d <delim> -f <fields> somefile | sponge somefile

9

আমি cutএকা ব্যবহার করা সম্ভব বলে মনে করি না। আমি এটি মানুষ বা তথ্য পৃষ্ঠায় খুঁজে পাইনি। আপনি যেমন কিছু করতে পারেন

mytemp=$(mktemp) && cut -d" " -f1 file > $mytemp && mv $mytemp file

mktempআপনাকে তুলনামূলকভাবে নিরাপদ অস্থায়ী ফাইল তৈরি করে যা আপনি cutআউটপুটটি পাইপ করতে পারেন ।


1

ভিম-ওয়ে চেষ্টা করুন:

$ ex -s +'%!cut -c 1-10' -cxa file.txt

এটি স্থানটিতে ফাইল সম্পাদনা করবে (সুতরাং প্রথমে ব্যাকআপটি করুন)।

বিকল্পভাবে ব্যবহার করুন grep, sedবা gawk



0

ঠিক আছে, যেহেতু 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

সতর্ক থাকুন যে সমস্ত পদ্ধতিতে প্রকৃত ইন-প্লেস রাইটিংয়ে জড়িত, যদি অপারেশন মাঝপথে বিঘ্নিত হয় তবে আপনি একটি দূষিত ফাইলটি শেষ করবেন। একটি অস্থায়ী দ্বিতীয় ফাইল ব্যবহার করা এই সমস্যা এড়ায়।

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