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 এর বিশেষ সংস্করণটির জন্য কোনও প্রয়োজন এড়ানো হয়।