unix - কিন্তু জায়গায় ফাইল সম্পাদনা করুন




sed solaris (9)

যদি আপনি একই পরিমাণ অক্ষরের প্রতিস্থাপন করেন এবং ফাইলগুলির সম্পাদনাতে " যথাযথভাবে " পড়ার পরে ...

আপনি ফাইলটি পড়তে এবং লিখতে ফাইলটি খুলতে পুনঃনির্দেশ অপারেটর <> ব্যবহার করতে পারেন:

sed 's/foo/bar/g' file 1<> file

এটি লাইভ দেখুন:

$ cat file
hello
i am here                           # see "here"
$ sed 's/here/away/' file 1<> file  # Run the `sed` command
$ cat file
hello
i am away                           # this line is changed now

Bash রেফারেন্স ম্যানুয়াল থেকে 3.6.10 পঠন এবং লেখার জন্য ফাইল বর্ণনাকারীর খোলা :

পুনঃনির্দেশ অপারেটর

[n]<>word

ফাইল বর্ণনাকারীর এন পড়ার এবং লেখার জন্য, অথবা ফাইল বর্ণনাকারী 0 উভয়ের জন্য যদি শব্দের সম্প্রসারণ খোলা হয়, তবে ফাইলটি বর্ণনা করে। ফাইল উপস্থিত না থাকলে, এটি তৈরি করা হয়।

আমি একটি নতুন ফাইলের মধ্যে সম্পাদিত সামগ্রীটি নিজে নিজে স্ট্রিমিং না করে এবং একটি নতুন ফাইলটিকে মূল ফাইলের নামটিতে পুনঃনামকরণ না করেই একটি সিলেক্ট কমান্ডে কোনও ফাইল সম্পাদনা করা সম্ভব কিনা তা খুঁজে বের করার চেষ্টা করছি। আমি -i বিকল্পটি চেষ্টা করেছি কিন্তু আমার সৌরজ সিস্টেমটি বলেছে যে -i একটি অবৈধ বিকল্প। একটি ভিন্ন উপায় আছে?


আপনি sed সঙ্গে কি চান তা সম্ভব নয়। এমনকি কোনও ফাইল সম্পাদনা করার জন্য -i বিকল্পটি সমর্থনের জন্য sed সংস্করণগুলিও ঠিক আছে যা আপনি স্পষ্টভাবে উল্লেখ করেছেন না যা আপনি চান না: তারা একটি অস্থায়ী ফাইলে লিখুন এবং তারপরে ফাইলটির নাম পরিবর্তন করুন। কিন্তু সম্ভবত আপনি শুধু ed ব্যবহার করতে পারেন। উদাহরণস্বরূপ, file.txt ফাইলটিতে bar foo সমস্ত ঘটনা পরিবর্তন করতে, আপনি যা করতে পারেন:

echo ',s/foo/bar/g; w' | tr \; '\012' | ed -s file.txt

সিনট্যাক্স sed অনুরূপ, কিন্তু অবশ্যই ঠিক একই না।

কিন্তু সম্ভবত আপনি একটি নামকরণ করা অস্থায়ী ফাইল ব্যবহার করতে চান না কেন বিবেচনা করা উচিত। এমনকি যদি আপনার sed -i সমর্থনকারী না থাকে তবে আপনার পক্ষে কাজটি সহজেই একটি স্ক্রিপ্ট লিখতে পারেন। sed -i 's/foo/bar/g' file , আপনি inline file sed 's/foo/bar/g' । যেমন একটি স্ক্রিপ্ট লিখতে তুচ্ছ। উদাহরণ স্বরূপ:

#!/bin/sh -e
IN=$1
shift
trap 'rm -f $tmp' 0
tmp=$( mktemp )
<$IN "[email protected]" >$tmp && cat $tmp > $IN  # preserve hard links

সর্বাধিক ব্যবহারের জন্য পর্যাপ্ত হতে হবে।


আপনি কোন শেলটি ব্যবহার করছেন তা উল্লেখ করেন নি, কিন্তু zsh দিয়ে আপনি এটি অর্জন করতে =( ) গঠন ব্যবহার করতে পারেন। লাইন বরাবর কিছু:

cp =(sed ... file; sync) file

=( ) এর অনুরূপ >( ) কিন্তু একটি অস্থায়ী ফাইল তৈরি করে যা cp টারমিনেট করে স্বয়ংক্রিয়ভাবে মুছে ফেলা হয়।


একটি বিষয় মনে রাখবেন, sed একটিমাত্র উদ্দেশ্য হিসাবে নিজেরাই ফাইলগুলি লিখতে পারে না "স্ট্রিম" (যেমন স্টিডিন, স্টডাউট, স্টেডার, এবং অন্যান্য >&n বাফার, সকেট এবং পপের পাইপলাইনে) হিসাবে সম্পাদন করা হয়। । এই মনের সাথে আপনি আবার ফাইলটিতে আউটপুট লিখতে অন্য কমান্ড tee ব্যবহার করতে পারেন। আরেকটি বিকল্প একটি প্যাচ তৈরি করা হয় বিষয়বস্তু পাইপ থেকে diff

টি পদ্ধতি

sed '/regex/' <file> | tee <file>

প্যাচ পদ্ধতি

sed '/regex/' <file> | diff -p <file> /dev/stdin | patch

হালনাগাদ:

এছাড়াও, নোট আউটপুট লাইন 1 থেকে প্যাচ ফাইলটি পরিবর্তন করতে হবে তা মনে রাখবেন:

প্যাচটি কোন ফাইলটিকে অ্যাক্সেস করতে হবে তা জানা দরকার না কারণ এটি ডিফল্ট আউটপুট প্রথম লাইনে পাওয়া যায়:

$ echo foobar | tee fubar

$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin
*** fubar   2014-03-15 18:06:09.000000000 -0500
--- /dev/stdin  2014-03-15 18:06:41.000000000 -0500
***************
*** 1 ****
! foobar
--- 1 ----
! fubar

$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin | patch
patching file fubar

নিম্নলিখিত আমার ম্যাক জরিমানা কাজ করে

sed -i.bak 's/foo/bar/g' sample

আমরা নমুনা ফাইল বার সঙ্গে foo প্রতিস্থাপন করা হয়। মূল ফাইল ব্যাকআপ sample.bak সংরক্ষিত হবে

ব্যাকআপ ছাড়া ইনলাইন সম্পাদনা করার জন্য নিম্নলিখিত কমান্ডটি ব্যবহার করুন

sed -i'' 's/foo/bar/g' sample

মনে রাখবেন যে এই কমান্ডটি চলাকালীন ওএস এক্স-এ আপনাকে "অবৈধ কমান্ড কোড" বা অন্য অদ্ভুত ত্রুটিগুলির মতো অদ্ভুত ত্রুটি হতে পারে। এই সমস্যা ঠিক করার চেষ্টা করুন

sed -i '' -e "s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g" <file>

এটি কারণ এসইএস এর OSX সংস্করণে, -i বিকল্পটি একটি extension আর্গুমেন্টের প্রত্যাশা করে যাতে আপনার কমান্ড আসলে extension যুক্তি হিসাবে পার্স করা হয় এবং ফাইল পাথটি কমান্ড কোড হিসাবে ব্যাখ্যা করা হয়। উত্স: https://.com/a/19457213


সিস্টেমে যেখানে সিস্টেমে ফাইলগুলি সম্পাদনা করার ক্ষমতা নেই, আমার মনে হয় perl ব্যবহার করার জন্য আরও ভাল সমাধান হবে:

perl -pi -e 's/foo/bar/g' file.txt

যদিও এটি একটি অস্থায়ী ফাইল তৈরি করে তবে এটি মূল প্রতিস্থাপন করে কারণ একটি ফাঁকা স্থানে যথোপযুক্ত সৃষ্টিকর্তা / এক্সটেনশান সরবরাহ করা হয়েছে।


sed জায়গায় সম্পাদনা সমর্থন করে। man sed থেকে:

-i[SUFFIX], --in-place[=SUFFIX]

    edit files in place (makes backup if extension supplied)

উদাহরণ :

ধরুন আপনার পাঠ্য সহ hello.txt ফাইল আছে:

hello world!

আপনি পুরানো ফাইল ব্যাকআপ রাখতে চান, তাহলে ব্যবহার করুন:

sed -i.bak 's/hello/bonjour' hello.txt

আপনি দুটি ফাইল দিয়ে শেষ হবেন: কন্টেন্ট সহ hello.txt :

bonjour world!

এবং পুরানো কন্টেন্ট সঙ্গে hello.txt.bak

আপনি যদি একটি অনুলিপি রাখতে না চান তবে এক্সটেনশন প্যারামিটারটি পাস করবেন না।


mv file.txt file.tmp && sed 's/foo/bar/g' < file.tmp > file.txt

সমস্ত হার্ডলিঙ্ক সংরক্ষণ করা উচিত, কারণ আউটপুটটি মূল ফাইলের সামগ্রীর উপরে ওভাররাইট করার জন্য নির্দেশিত হয় এবং sed এর বিশেষ সংস্করণটির জন্য কোনও প্রয়োজন এড়ানো হয়।





solaris