আমি কি `ট্রির মতো চরিত্র অনুবাদ করতে` সেড` ব্যবহার করতে পারি?


14

আমি অন্য সেট থেকে সম্পর্কিত অক্ষরের সাথে অক্ষরের একটি সেট প্রতিস্থাপন করতে চাই, এরকম কিছু:

original set: ots
"target" set: u.x

foobartest → fuubar.ex.

এর মতো অনুবাদ / অনুলিখন হ'ল trকমান্ডের বিশেষত্ব :

$ echo 'foobartest' | tr 'ots' 'u.x'
fuubar.ex.

দুর্ভাগ্যক্রমে trফাইলগুলি জায়গায় জায়গায় পরিবর্তন করা সমর্থন করে না sed
আমি ব্যবহার করতে চাই sedযাতে টেম্প ফাইলগুলির জাগলিংয়ের চাকাটি আমার কাছে পুনরায় উদ্ভাবন করতে হবে না।


এই প্রশ্নের স্ব-জবাব দেওয়ার পরে যেহেতু "সেড ট্রান্সলেট অক্ষর" এর জন্য আমি কোনও ফলাফল খুঁজে পাচ্ছি না। ম্যাজিক কীওয়ার্ডটি "লিপ্যন্তরেখা" হিসাবে শেষ হয়েছে তবে আমি বুঝতে পেরেছিলাম যে এই বৈশিষ্ট্যটি যতটা সম্ভব সন্ধানযোগ্য making
n.st

এই জন্য সমাধান নীচে উপস্থিত বাস্তবায়ন করার চেষ্টা মনে রাখা কিছু: tr(সঠিকভাবে) প্রতিস্থাপন সেটে পুনরাবৃত্তির উপেক্ষা করে: echo 'abc' | tr ab bxbxc। একটি আদিম সমাধান কসাই পারে xxcকারণ এটি ইতিমধ্যে অনুবাদ করা অক্ষরগুলিতে অনুবাদটি পুনরায় প্রয়োগ করে।
n.st

সম্পর্কিত: ইউনিকোড অক্ষরের জন্য টিআর এনালগ? (জিএনইউ এর sedবিপরীতে জিএনইউ trএকাধিক বাইট অক্ষর
লিখিতভাবে লিখতে পারে

আপনি যদি আরও একটি সম্ভাবনা চান: পার্ল অনুবাদ করতে পারেন, এবং -i, এবং (প্রাচীন না) মাল্টিবাইট। পসিক্স নয়, তবে বেশ সাধারণ।
dave_thompson_085

উত্তর:


24

sedহয়েছে yকমান্ড যে শুধু ভালো কাজ করে tr:

$ echo 'foobartest' | sed 'y/ots/u.x/'
fuubar.ex.

yকমান্ড অংশ POSIX sedস্পেসিফিকেশন , তাই এটি কাজ করা উচিত ঠিক কোন প্ল্যাটফর্ম সম্পর্কে।

এবং যেহেতু sed, এটির পরিবর্তিত টেম্প ফাইল ব্যবসায়কে ছাড়িয়ে আপনি কোনও ফাইলকে এর সম্পাদিত সংস্করণ দিয়ে প্রতিস্থাপন করতে পারেন ( পশিক্স দ্বারা নির্দিষ্ট নয় sedএমন -iবিকল্পটিকে সমর্থন করে )

$ sed -i 'y/ots/u.x/' some-file.txt

@ স্টাফেনচাজেলাস এটি নির্দেশ করার জন্য ধন্যবাদ; আমি এখন পর্যন্ত অভ্যন্তরীণ কাজ সম্পর্কে সচেতন ছিলাম না। আমি উল্লেখ করতে আমার উত্তর সম্পাদনা করেছি।
n.st

ধন্যবাদ, এটি অসাধারণভাবে দরকারী! আমি এটি ভিআইএম-এ কাজ করার আশা করছিলাম (সেন্টোস 7.৩-তে ৮.০.১০৯২) তবে তা হয় না। কিছু কি সেড করা উচিত নয়, ভিআইএম করে?
dotancohen

1
@ ডোটানকোহেন ঠিক এই কারণে যে ভিমের প্রতিস্থাপন ফাংশনটি মডেল করা sedহয়েছে তার পরে অন্যান্য ফাংশনগুলিও বোঝায় না। ;) ভিম মেলিং তালিকার সমতুল্য অনুসন্ধান সম্পর্কে একটি থ্রেড রয়েছে y/abc/def/; সেরা বিকল্প বলে মনে হচ্ছে :%call setline(".", tr(getline("."),"abc","def"))
n.st

8

যদি আপনার ক্ষেত্রে পছন্দ হয় তবে আপনি অক্ষরগুলির আকার পরিবর্তন না করেই লিপ্যন্তরিত করছেন (যাইহোক, কিছু বাস্তবায়ন যেমন জিএনইউ trকেবলমাত্র একক-বাইট অক্ষরকে সমর্থন করে), আপনি এটি করতে পারেন:

tr 'ots' 'u.x' < file 1<> file

অর্থাৎ trফাইলটি নিজেই ওভাররাইট করুন।

sed -iএটি বেশ কয়েকটি অ্যাকাউন্টের চেয়ে ভাল :

  • এটির জন্য অতিরিক্ত ডিস্ক স্পেসের প্রয়োজন নেই (কিছু স্পার ফাইল বাদে, অনুলিপি লিখুন বিশেষ ক্ষেত্রে)
  • এটি ইনোড নম্বর, মালিকানা, অনুমতি, এসিএল সংরক্ষণ করে ...
  • এটি সিমলিংকের সাথে ঠিক আছে, এটি শক্ত লিঙ্কগুলিকে ভাঙবে না
  • এটি যখন মারা যায় তখন টেম্পোর ফাইলগুলি পড়ে থাকে না।

একটি অসুবিধা হ'ল যদি এটি বাধাগ্রস্ত হয় তবে ফাইলটি অর্ধ-অনুবাদিত হয়ে শেষ হবে (এই ক্ষেত্রে আপনি এটি শেষ করতে আবার চালাতে পারেন)। কিছু sedবাস্তবায়ন কমান্ডটি সফল না হলে মূল ফাইলটি অপরিবর্তিত রয়েছে তা নিশ্চিত করে এটি সঠিকভাবে পরিচালনা করবে।


3
সাবধান পুনরায় চলমান অনুবাদ যদি অনুবাদ সেটে পুনরাবৃত্তির পেয়েছেন, যেমন হউন echo 'abc' | tr ab bx
n.st

1
@ n.st, হ্যাঁ, এজন্যই আমি এই ক্ষেত্রে বললাম , যদিও আমি এটির বানানটি মূল্যবান বলে সম্মত।
স্টাফেন চেজেলাস

শেষ অবধি , আমাকে টেম্পল ফাইলগুলির সাথে সর্বোপরি কাজ করতে হয়েছিল: gist.github.com/n-st/048facd0c12f105ac122030fb58b962f - মাল্টিবাইট অক্ষরগুলি জিএনইউ ব্যবহার করা অসম্ভব করে তুলেছিলtr এবং আমাদের সিএমলিঙ্ক-ভারী পিএক্সই পরিবেশে, sed -iএকটি স্ক্রু-আপ অপেক্ষা ছিল ঘটতে হবে ...: /
n.st

@ n.st, এটির iconv -t cp437জন্য আরও উপযুক্ত বলে মনে হচ্ছে।
স্টাফেন চেজেলাস

iconvব্রেক ইনপুট ফাইলটিতে ইতিমধ্যে সিপি 437-এনকোডড বাইট বা একাধিক এনকোডিংয়ের মিশ্রণ রয়েছে break সুতরাং এটি সাধারণ ক্ষেত্রে পছন্দনীয় হলেও এই ক্ষেত্রে ম্যানুয়াল প্রতিস্থাপন করা আরও দৃust়।
n.st

4

অন্য বিকল্প হিসাবে, যদি আপনার মূল সমস্যাটি জায়গাটিতে স্থান পরিবর্তন করার পক্ষে সমর্থন না থাকে তবে আপনি সম্ভবত আরও প্যাকেজ প্যাকেজsponge থেকে সরঞ্জামটির প্রতি আগ্রহী হতে পারেন :

tr 'ots' 'u.x' < file | sponge file

লিখতে হবে file, তবে fileইনপুট সম্পূর্ণ হয়ে গেলে কেবল লেখার জন্য উন্মুক্ত হবে । ম্যানপেজ থেকে :

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

যদি না আপনার কাছে সত্যিই বড় ফাইল থাকে যা মেমোরিতে রাখা যায় না, spongeআপনার পক্ষে কাজ করতে পারে।


2
সঙ্গে এক ইস্যু spongeযে এটি এখনও মুছে ফেলা হয় হয় fileযদি tr(উদাহরণস্বরূপ যদি আপনার কাছে লিখনের কাজ করতেন কিন্তু অনেক অ্যাক্সেস নাও পড়তে ব্যর্থ file)
Stéphane Chazelas

ওহ, সত্যিই এটা করে; আমি এটা আশা করিনি। ধন্যবাদ।
মাইন্ড্রিয়ট

দেখুন cat file >; fileksh93 এর অপারেটর যা tempfile যা গন্তব্যে নতুন নামকরণ করা হয় শুধুমাত্র যদি কমান্ড সফল আউটপুট লিখেছেন (কিন্তু মত sed -iপরিবর্তে মূল মুছে একটি নতুন ফাইল তৈরি করে,)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.