বাশ ব্যবহার করে "স্থানে" এর ফাইল (যুক্তি) সম্পাদনা করার কোনও আদেশ আমি কীভাবে সম্পাদন করব?


110

আমার কাছে টেম্প টেক্সট ফাইল রয়েছে, যা আমি কমান্ডটি বাশ-এ সাজিয়ে রাখতে চাই sort

আমি চাইছি সাজানো ফলাফলগুলি মূল ফাইলটি প্রতিস্থাপন করবে।

এটি উদাহরণস্বরূপ কাজ করে না (আমি একটি খালি ফাইল পাই):

sortx temp.txt > temp.txt

অস্থায়ী ফাইলগুলিতে অনুলিপি না করেই কি এক লাইনে এটি করা যায়?


সম্পাদনা: -oবিকল্পটি খুব দুর্দান্ত sort। আমি sortআমার প্রশ্নের উদাহরণ হিসাবে ব্যবহার করেছি। আমি অন্যান্য কমান্ডের সাথে একই সমস্যায় পড়েছি:

uniq temp.txt > temp.txt.

এর চেয়ে ভাল আরও সাধারণ সমাধান কি আছে?


উত্তর:


171
sort temp.txt -o temp.txt

3
এটি একটি উত্তর। আমি আসলেই ভাবছিলাম যে এই সমস্যার কোনও জেনেরিক সমাধান আছে কিনা। উদাহরণস্বরূপ, যদি আমি একটি "সমস্ত জায়গায়" ফাইলগুলিতে ইউএনআইকিউ লাইনগুলি সন্ধান করতে চাই, আমি -o
জেএম

এটি জেনেরিক নয়, তবে আপনি অনন্য লাইনগুলি খুঁজে পেতে GNU সাজানোর সাহায্যে ব্যবহার করতে পারেন
জেমস

উদাহরণস্বরূপ, কেউ কি সমস্যার সমাধান করতে পেরেছে sort --inplace *.txt? এটি অদ্ভুত সুন্দর হবে
sehe

@ এই চেষ্টা করুন:find . -name \*.txt -exec sort {} -o {} \;
কেইথ

29

একটি sortসমস্ত ইনপুট দেখতে আগেই আউটপুট শুরু করতে পারবেন। এই কারণে, sortপ্রোগ্রামটি সহজেই স্থানটিতে কোনও ফাইল সংশোধন করার জন্য একটি বিকল্প প্রস্তাব করতে পারে:

sort temp.txt -o temp.txt

বিশেষত, জিএনইউয়ের নথিsort বলছে:

সাধারণত, সাজানো আউটপুট-ফাইল খোলার আগে সমস্ত ইনপুট পড়ে, তাই আপনি sort -o F Fএবং এর মতো কমান্ড ব্যবহার করে কোনও ফাইলকে নিরাপদে জায়গায় বাছাই করতে পারেন cat F | sort -o F। যাইহোক, ( ) sortদিয়ে সমস্ত ইনপুট পড়ার আগে আউটপুট ফাইলটি খুলতে পারে, সুতরাং কোনও কমান্ড নিরাপদ নয় যেমন বাছাই করা এটি পড়া শেষ হওয়ার আগে লিখতে শুরু করে।--merge-mcat F | sort -m -o F - GFcat

বিএসডির নথি sortবলছে:

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

কমান্ডগুলি যেমন uniqইনপুট পড়া শেষ করার আগে আউটপুট লেখা শুরু করতে পারে। এই কমান্ডগুলি সাধারণত ইন-প্লেস সম্পাদনা সমর্থন করে না (এবং তাদের পক্ষে এই বৈশিষ্ট্যটি সমর্থন করা শক্ত হবে)।

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

uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'

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


19

এখানে আরও সাধারণ পন্থা রয়েছে, ইউনিক, বাছাই করা এবং কী করা যায় না তা নিয়ে কাজ করে।

{ rm file && uniq > file; } < file

14
আরেকটি জেনেরিক পদ্ধতির সঙ্গে spongemoreutils থেকে: cat file |frobnicate |sponge file
টুবু

3
@ তোবু: আলাদা উত্তর হিসাবে কেন জমা দিবেন না?
ফ্লিম

1
এটি সম্ভবত ফাইলের অনুমতিগুলি সংরক্ষণ করে না বলে মনে করা ভাল। আপনার উমাস্ক নতুন অনুমতিগুলি কী হবে তা নির্দেশ করে।
wor

1
কৌতুকময়। এটি কীভাবে কাজ করে তা আপনি ব্যাখ্যা করতে পারেন?
patryk.beza

2
@ patryk.beza: ক্রমানুসারে: ইনপুট এফডি মূল ফাইল থেকে খোলা হয়; মূল ডিরেক্টরি এন্ট্রি মুছে ফেলা হয়; পুনঃনির্দেশটি প্রক্রিয়া করা হয়, পুরানো নামটি একই নামে নতুন খালি ফাইল তৈরি করে; তারপরে কমান্ডটি চালিত হয়।
চার্লস ডাফি

10

স্পঞ্জ ওয়ারেন্ট সম্পর্কে টোবুর মন্তব্যটি তার নিজের পক্ষে উত্তর being

আরও ব্যবহার্য মূল পৃষ্ঠা থেকে উদ্ধৃতি দিতে :

সম্ভবত এখন পর্যন্ত বেশি ব্যবহারকারীর সবচেয়ে সাধারণ উদ্দেশ্য সরঞ্জামটি স্পঞ্জ (1), যা আপনাকে এই জাতীয় জিনিসগুলি করতে দেয়:

% sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd

তবে স্টিভ জেসোপ এখানে মন্তব্যsponge করেছেন একই সমস্যা থেকে ভোগেন পাইপলাইনে কোনও কমান্ড যদি spongeব্যর্থ হওয়ার আগে হয় তবে মূল ফাইলটি লেখা হবে।

$ mistyped_command my-important-file | sponge my-important-file
mistyped-command: command not found

আহ-ওহ, my-important-fileচলে গেছে।


1
স্পঞ্জ জানে যে এটি ইনপুট ফাইলটি প্রতিস্থাপন করতে ব্যবহৃত হবে এবং এটি প্রথমে একটি দৌড়ের অবস্থা এড়ানোর জন্য একটি টেম্প ফাইল তৈরি করে। এটি কাজ করার জন্য, স্পঞ্জ অবশ্যই পাইপলাইনের শেষ উপাদান হতে হবে এবং এটি নিজেই আউটপুট ফাইল তৈরি করার অনুমতি দিতে হবে (উদাহরণস্বরূপ শেল-স্তরের আউটপুট পুনঃনির্দেশের বিপরীতে)। বিটিডাব্লু: মনে হচ্ছে 'ফেইল' কেসের জন্য সহজ সোর্স-কোড ফিক্সটি হ'ল পাইপফেইলের ক্ষেত্রে টেম্প ফাইলটির নতুন নামকরণ করা হবে না (কেন স্পঞ্জের বিকল্প নেই তা জানেন না)।
ব্রেন্ট ব্র্যাডবার্ন

আমি মনে করি আপনি যদি set -o pipefailআপনার স্ক্রিপ্টের শুরুতে যুক্ত করেন, ত্রুটিটি mistyped_command my-important-fileকার্যকর করার আগে স্ক্রিপ্টটি তাত্ক্ষণিকভাবে প্রস্থান করে ফেলবে sponge, এইভাবে গুরুত্বপূর্ণ ফাইলটি সংরক্ষণ করে।
এলুয়ান কেরেল-এমনকি

6

এখানে আপনি যান, একটি লাইন:

sort temp.txt > temp.txt.sort && mv temp.txt.sort temp.txt

প্রযুক্তিগতভাবে অস্থায়ী ফাইলটিতে কোনও অনুলিপি নেই, এবং 'এমভি' কমান্ডটি তাত্ক্ষণিক হওয়া উচিত।


6
হুঁ। আমি তখনও টেম্প টেক্সট কল করব call একটি অস্থায়ী ফাইল বাছাই করুন।
জেস্পেরে

5
এই কোডটি ঝুঁকিপূর্ণ, কারণ যদি কাজটি সম্পন্ন না করেই যেকোন কারণে বাছাই করে ব্যর্থ হয় তবে মূলটি ওভাররাইট করা হয়।
স্টিভ জেসোপ

1
একটি ডিস্ক জায়গার অভাব একটি কল্পনাযোগ্য কারণ বা একটি সংকেত (ব্যবহারকারী সিটিআরএল-সি হিট করে)।
স্টিভ জেসোপ

5
আপনি যদি এর পরিবর্তে & & (যৌক্তিক এবং) এর মতো কিছু ব্যবহার করতে চান; কারণ এটি ব্যবহার করে নিশ্চিত হয়ে যাবে যে পরবর্তী কমান্ডটি ব্যর্থ হলে কার্যকর হবে না। উদাহরণস্বরূপ: সিপি ব্যাকআপ.আটার / রুট / ব্যাকআপ.এটার এবং & আরএম ব্যাকআপ.টার যদি আপনার অনুলিপি করার অধিকার না থাকে তবে ফাইলটি মোছা হবে না বলে আপনি নিরাপদে থাকবেন
ড্যানিয়েলস

1
আপনার পরামর্শগুলি
আমলে

4

আমি sort file -o fileউত্তরটি পছন্দ করি তবে একই ফাইলের নামটি দু'বার টাইপ করতে চাই না।

বেস ইতিহাসের সম্প্রসারণ ব্যবহার :

$ sort file -o !#^

আপনি যখন টিপেন তখন বর্তমান লাইনের প্রথম আরগটি ধরে ফেলে enter

জায়গায় একটি অনন্য সাজান:

$ sort -u -o file !#$

বর্তমান লাইনে সর্বশেষ আর্গু আঁকড়ে।


3

অনেকে -o বিকল্পটি উল্লেখ করেছেন । ম্যান পেজ অংশ এখানে।

ম্যান পৃষ্ঠা থেকে:

   -o output-file
          Write output to output-file instead of to the  standard  output.
          If  output-file  is  one of the input files, sort copies it to a
          temporary file before sorting and writing the output to  output-
          file.

3

এটি উচ্চ মেমরির প্রতিবন্ধক হবে, তবে আপনি স্মৃতিতে অন্তর্বর্তী ডেটা সংরক্ষণ করতে বিশ্রী ব্যবহার করতে পারেন এবং তারপরে এটি আবার লিখতে পারেন।

uniq temp.txt | awk '{line[i++] = $0}END{for(j=0;j<i;j++){print line[j]}}' > temp.txt

আমি মনে করি এটা সম্ভব> কাটছাঁট করে কমান্ড সামনে ফাইল ( uniqএই ক্ষেত্রে) এটি পড়ে।
মার্টিন

3

একটি বিকল্প spongeআরো সাধারণ সঙ্গে sed:

sed -ni r<(command file) file

এটা কোনো কমান্ড (জন্য কাজ করে sort, uniq, tac, ...) এবং ব্যবহারসমূহ খুব সুপরিচিত sed'র -iবিকল্প (ইন-জায়গা সম্পাদন করা ফাইল)।

সতর্কতা:command file প্রথমে চেষ্টা করুন কারণ স্থানে থাকা ফাইলগুলি সম্পাদনা করা প্রকৃতির দ্বারা নিরাপদ নয়।


ব্যাখ্যা

প্রথমত, আপনি কহন করছি sed(মূল) লাইন (প্রিন্ট করতে না -nবিকল্প ), এবং সাহায্যে sed'র rকমান্ড এবং bashএর প্রক্রিয়া উপকল্পন দ্বারা উত্পাদিত সামগ্রী <(command file)আউটপুট সংরক্ষণ করা হবে জায়গায়


জিনিসগুলি আরও সহজ করে তোলা

আপনি এই সমাধানটিকে কোনও কার্যক্রমে গুটিয়ে রাখতে পারেন:

ip_cmd() { # in place command
    CMD=${1:?You must specify a command}
    FILE=${2:?You must specify a file}
    sed -ni r<("$CMD" "$FILE") "$FILE"
}

উদাহরণ

$ cat file
d
b
c
b
a

$ ip_cmd sort file
$ cat file
a
b
b
c
d

$ ip_cmd uniq file
$ cat file
a
b
c
d

$ ip_cmd tac file
$ cat file
d
c
b
a

$ ip_cmd
bash: 1: You must specify a command
$ ip_cmd uniq
bash: 2: You must specify a file

1

যুক্তি ব্যবহার করুন --output=বা-o

সবেমাত্র ফ্রিবিএসডি-তে চেষ্টা করা হয়েছে:

sort temp.txt -otemp.txt

যদিও সঠিক, এটি কেবল এই উত্তরের
17:55



0

আপনি যদি sortপ্রোগ্রামটি ব্যবহারের জন্য জোর দিয়ে থাকেন তবে আপনাকে একটি মধ্যবর্তী ফাইল ব্যবহার করতে হবে - আমি মনে করি sortনা মেমরির বাছাইয়ের কোনও বিকল্প আছে। Stdin / stdout সহ অন্য কোনও কৌশল ব্যর্থ হবে যদি আপনি গ্যারান্টি দিতে না পারেন তবে বাছাইয়ের স্ট্ডিনের বাফার আকারটি পুরো ফাইলের সাথে ফিট করার পক্ষে যথেষ্ট।

সম্পাদনা: আমার জন্য লজ্জা। sort temp.txt -o temp.txtদুর্দান্ত কাজ করে।


আমি প্রশ্নটিও "ইন-প্লেস" হিসাবে পড়েছি কিন্তু দ্বিতীয় পাঠ আমাকে বিশ্বাস করেছে যে সে সত্যই এর জন্য জিজ্ঞাসা করছে না
এপেটেল

0

আরেকটি সমাধান:

uniq file 1<> file

তবে এটি লক্ষ করা উচিত যে <>কৌশলটি কেবল এই ক্ষেত্রে কাজ করে কারণ uniqএটি বিশেষ যে এটি কেবল ইনপুট লাইনগুলি আউটপুট লাইনে অনুলিপি করে, কিছু পথে ফেলে দেয়। যদি অন্য কমান্ড (উদাহরণস্বরূপ sed) ব্যবহৃত হয় যা ইনপুট পরিবর্তন করে (উদাহরণস্বরূপ প্রতিটি aরূপান্তরিত হবে aa), তবে এটি fileএমন উপায়ে ওভাররাইড করতে পারে যা কোনও অর্থ দেয় না এবং এমনকি অসীমভাবে লুপ করে, ইনপুট যথেষ্ট পরিমাণে সরবরাহ করে (একের চেয়ে অনেক বেশি) একক পঠন বাফার)।
ডেভিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.