লিনাক্স: একই সাথে ইনপুট এবং আউটপুট হিসাবে কোনও ফাইল কীভাবে ব্যবহার করবেন?


55

আমি সবেমাত্র নিম্নলিখিতগুলিতে ব্যাশ চালিয়েছি:

uniq .bash_history > .bash_history

এবং আমার ইতিহাস ফাইলটি সম্পূর্ণ খালি হয়ে গেছে।

আমার ধারণা, পুরো ফাইলটি লেখার আগে আমার একটি পঠন দরকার need তা কীভাবে হয়?

PS: আমি স্পষ্টতই একটি অস্থায়ী ফাইল ব্যবহার করার কথা ভেবেছিলাম, তবে আমি আরও মার্জিত সমাধানের সন্ধান করছি।


ফাইলগুলি ডান থেকে বামে খোলার কারণ এটি। আরও দেখুন stackoverflow.com/questions/146435/...
WheresAlice

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

অথবা, bashযদি আপনি উপেক্ষিতগুলিকে অন্তর্ভুক্ত করতে HISCONTROL সেট করে থাকেন তবে এর ইতিহাসে পরপর দুগ্ধগুলি রাখবে না; ম্যানপেজ দেখুন।
dave_thompson_085

উত্তর:


49

আমি Moreutilssponge থেকে ব্যবহার করার পরামর্শ দিচ্ছি । ম্যানপেজ থেকে:

DESCRIPTION
  sponge  reads  standard  input  and writes it out to the specified file. Unlike
  a shell redirect, sponge soaks up all its input before opening the output file.
  This allows for constructing pipelines that read from and write to the same 
  file.

আপনার সমস্যায় এটি প্রয়োগ করতে চেষ্টা করুন:

uniq .bash_history | sponge .bash_history

6
এটি বিড়ালের মতো, তবে স্তন্যপান ক্ষমতার সাথে: ডি
মিলিয়ালওভার

77

আমি কেবলমাত্র একটি সহজ উত্তরটি অবদান রাখতে চেয়েছিলাম যা সহজ, এবং স্পঞ্জ ব্যবহার করে না (কারণ এটি প্রায়শই হালকা ওজনের পরিবেশে অন্তর্ভুক্ত থাকে না)।

echo "$(uniq .bash_history)" > .bash_history

কাঙ্ক্ষিত ফলাফল হওয়া উচিত। সাবশেলটি লেখার জন্য খোলার আগেই তা কার্যকর করা হবে। ফিল পি এর উত্তরে যেমন ব্যাখ্যা করা হয়েছে, ততক্ষণে .Bash_history মূল কমান্ডে পড়ে, এটি ইতিমধ্যে '>' অপারেটর দ্বারা কেটে গেছে।


15
আমি সাধারণত উত্তরগুলির ভক্ত নই যা ইতিমধ্যে একটি বৈধ, স্বীকৃত উত্তর রয়েছে এমন একটি প্রাচীন প্রশ্ন ড্রেজ করে - তবে এটি মার্জিত, ভাল-লিখিত এবং এর প্রয়োজনীয়তার (হালকা ওজনের পরিবেশ) পক্ষে দৃ argument় যুক্তি তোলে; আমার জন্য, এটি উত্তরগুলির বিদ্যমান সেটগুলিতে সত্যিই কিছু যুক্ত করে। এসএফ, হার্টে আপনাকে স্বাগতম (আপনি এখানে এক মাস হয়ে গেছেন, তবে আমি মনে করি এটি আপনার প্রথম মজাদার পোস্টিং)। আমি এই মত আপনার কাছ থেকে আরও উত্তর পড়তে আশা করি!
ম্যাডহ্যাটার

4
এটিই সেরা সমাধান। $()কিছু পালানোর সমস্যার কারণে আমাকে ব্যাকটিক্সের পরিবর্তে সাবসেল ব্যবহার করতে হয়েছিল ।
সিএমসিডিগ্রাগনকাই

3
আমি ভাবছি যে এই সমাধানটি যদি বড় ফাইলগুলিতে স্কেল করে তবে বলে ... 20 বা 50 জিবি।
অমিত নাইডু

1
এটি সত্যই গ্রহণযোগ্য উত্তর হওয়া উচিত।
ম্যাক্সিউব

1
আমি echo "$(fmt -p '# ' -w 50 readme.txt)" > readme.txtআজই এই উত্তরটি ব্যবহার করেছি । একটি মার্জিত সমাধানের জন্য দীর্ঘ সময় ধরে অনুসন্ধান করছিল। অনেক ধন্যবাদ, @ হার্ট সিমহা!
shredalert

12

সমস্যাটি হ'ল আপনার শেল কমান্ডগুলি চালানোর আগে কমান্ড পাইপলাইন স্থাপন করছে। এটি "ইনপুট এবং আউটপুট" এর বিষয় নয়, এটি ইউনিক এমনকি চালানোর আগেই ফাইলটির সামগ্রী ইতিমধ্যে চলে গেছে। এটি এমন কিছু যায়:

  1. শেল >লেখার জন্য আউটপুট ফাইলটি কেটে দেয়, এটি কেটে ফেলা হয়
  2. সেই আউটপুটটির জন্য ফাইল-বর্ণনাকারী 1 (স্টাডাউটের জন্য) ব্যবহার করার জন্য শেলটি সেট আপ করে
  3. শেলটি ইউনিককে কার্যকর করে, সম্ভবত এক্সপ্লের মতো ("ইউনিক", "ইউনিক", ".বাশ_ইস্টরি", এনইউএল)
  4. ইউনিক দৌড়ায়, .বাশ hতিহাসিক খোলে এবং সেখানে কিছুই খুঁজে পায় না

ইনস-প্লেস এডিটিং এবং অস্থায়ী ফাইল ব্যবহার যা অন্যরা উল্লেখ করেছেন সহ বিভিন্ন সমাধান রয়েছে, তবে কীটি সমস্যাটি বোঝা যায়, আসলে কী ভুল হচ্ছে এবং কেন।


9

ব্যবহার না করে এটি করার আরেকটি কৌশলটি spongeহ'ল নিম্নলিখিত আদেশটি:

{ rm .bash_history && uniq > .bash_history; } < .bash_history

Backreferences.org এ ফাইলগুলি সম্পাদনা করার জন্য নিবন্ধটি "ইন-প্লেস" এর নিবন্ধে বর্ণিত এই চিটগুলির মধ্যে একটি।

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

এই সমাধানের অসুবিধা: uniqকোনও কারণে যদি ব্যর্থ হয় তবে আপনার ইতিহাস চলে যাবে।



3

এই sedস্ক্রিপ্টটি সংলগ্ন সদৃশগুলি সরিয়ে দেয়। সঙ্গে -iবিকল্প, এটা জায়গা পরিবর্তন করে। এটি sed infoফাইল থেকে :

sed -i 'h;:b;$b;N;/^\(.*\)\n\1$/ {g;bb};$b;P;D' .bash_history

সেড এখনও টেম্প ফাইল ব্যবহার করে, straceউদাহরণ সহ একটি উত্তর যুক্ত করেছে (এটি আসলেই গুরুত্বপূর্ণ নয়) :-)
কাইল ব্র্যান্ডেট

3
@ কাইল: সত্য, তবে "দৃষ্টির বাইরে, মনের বাইরে" ব্যক্তিগতভাবে, আমি স্পষ্টত অস্থায়ী ফাইলটি ব্যবহার করব যেহেতু কোনও টেম্প ফাইল এড়াতে কেবল কৌশল process input > tmp && mv tmp inputব্যবহারের চেয়ে অনেক সহজ এবং বেশি পঠনযোগ্য sedএবং এটি ব্যর্থ হলে এটি আমার মূলটিকে ওভাররাইট করতে পারে না (আমি জানি না যে sed -iনিখুঁতভাবে ব্যর্থ হয়েছে কিনা - আমি চাই যদিও এটি মনে হয়)। এছাড়াও, আউটপুট-টেম্প-ফাইল পদ্ধতিতে আপনি করতে পারেন এমন অনেকগুলি জিনিস রয়েছে যা এই sedস্ক্রিপ্টের চেয়ে আরও বেশি কিছু জড়িত ব্যতীত স্থানে করা যায় না । আমি জানি আপনি এগুলি জানেন তবে এটি কিছু দর্শকের পক্ষে উপকৃত হতে পারে।
ডেনিস উইলিয়ামসন

3

একটি আকর্ষণীয় টিডবিট হিসাবে, সেড একটি টেম্প ফাইলও ব্যবহার করে (এটি কেবল এটি আপনার জন্য করে):

$ strace sed -i 's/foo/bar/g' foo    
open("foo", O_RDONLY|O_LARGEFILE)       = 3
...
open("./sedPmPv9z", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4
...
read(3, "foo\n"..., 4096)               = 4
write(4, "bar\n"..., 4)                 = 4
read(3, ""..., 4096)                    = 0
close(3)                                = 0
close(4)                                = 0
rename("./sedPmPv9z", "foo")            = 0
close(1)                                = 0
close(2)                                = 0

বিবরণ:
টেম্পাইলটি এফডি ./sedPmPv9z4 হয়, এবং fooফাইলগুলি এফডি 3 হয় The পঠিত ক্রিয়াকলাপগুলি এফডি 3-তে হয়, এবং লেখাগুলি এফডি 4-তে লিখিত হয় (অস্থায়ী ফাইল)। Foo ফাইলটি পুনরায় নামক কলটিতে অস্থায়ী ফাইলের সাথে ওভাররাইট করা হয়।



0

একটি অস্থায়ী ফাইল এটির চেয়ে অনেক বেশি, যদি না প্রশ্নে কমান্ডটি স্থান সম্পাদনায় সমর্থন uniqকরে না ( না - কিছু কিছু sedকরতে পারে sed -i) ( )।


0

আপনি এক্স মোডে ভিম ব্যবহার করতে পারেন:

ex -sc '%!uniq' -cx .bash_history
  1. % সমস্ত লাইন নির্বাচন করুন

  2. ! আপনার আদেশ প্রদান করুন

  3. x সংরক্ষণ করেন এবং বন্ধ করেন


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