tr: এস্ট্রোফেরিকে ASCII তে রূপান্তর করুন


11

আমি রাইট সিঙ্গল কোটেশন মার্ককে একটি অ্যাপোসট্রোফ ব্যবহার করে রূপান্তর করার চেষ্টা করছি tr

tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b

একটি UTF-8 এনকোডযুক্ত ফাইল দেওয়া হয়েছে aযার মধ্যে এই উদাহরণ রয়েছে:

Were not a different species
All alone?” Jeth mentioned.

ওএস এক্স বিএসডি ব্যবহার করে trএবং একটি দুর্দান্ত ফলাফল দেয়:

We're not a different species
“All alone?” Jeth mentioned.

উবুন্টু GNU ব্যবহার করে trএবং এই দুষ্টু ফলটি উত্পাদন করে:

We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.

আমি কীভাবে উবুন্টুতে এই রূপান্তরটি সম্পাদন করতে পারি?


এছাড়াও চেষ্টা করা হয়েছে: একই ফলাফল সহ tr $ '\ xE2 \ x80 \ x99' $ '\ x27' <a> বি।
plamtrue


2
echo It’s easy | perl -CS -Mutf8 -pe "tr/’/'/"
tchrist

উত্তর:


16

আপনি অন্য কোনও সরঞ্জাম চেষ্টা করতে পারেন, যেমন sed:

$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.

বা, যেহেতু আমরা সহজ অনুবাদ করছি, yকমান্ডটি এর জন্য ব্যবহার করুন sed:

$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.

জিএনইউtr সম্ভবত কাজ করে না কারণ:

বর্তমানে trকেবলমাত্র একক-বাইট অক্ষরকে পুরোপুরি সমর্থন করে। শেষ পর্যন্ত এটি মাল্টিবাইট অক্ষরকে সমর্থন করবে; যখন এটি হয়, -C অপশনটি এটি অক্ষরের সেটকে পরিপূরক করে তোলে, যখন -c এটি মানগুলির সেটকে পরিপূরক করে। এই পার্থক্যটি কেবল তখনই কার্যকর হবে যখন কিছু মানগুলি অক্ষর না হয় এবং যখন ইনপুটটিতে এনকোডিংয়ের ত্রুটি থাকে তখন কেবল মাল্টিবাইট এনকোডিংগুলি ব্যবহার করে লোকালগুলিতে এটি সম্ভব হয়।

এবং এটি একটি মাল্টিবাইট চরিত্র:

$ echo -n \' | wc -c
1
$ echo -n  | wc -c  
3

1
sedএই ধরণের কাজের জন্য খুব সুন্দর।
কাজ ওল্ফ

2
শেষ অংশটি আরও ব্যাখ্যা করার জন্য: trতিনটি বাইটের প্রত্যেককে আলাদা করে প্রতিস্থাপন করা হচ্ছে ', সেইজন্য '''ভাঙ্গা ক্রমগুলি যেখানে এটি তিনটি বাইটের মধ্যে দুটিকে একই অক্ষরগুলিতে প্রতিস্থাপন করেছে এবং । এটি পরিবর্তে তিনটি বাইট একসাথে একটি চরিত্রের অর্থ বুঝতে হবে এবং পরিবর্তে এটি প্রতিস্থাপন করা উচিত।
deltab

ভাল বোঝার জন্য একটি মাল্টিবাইট চরিত্র এছাড়াও আমরা tr -c '[:print:][:cntrl:]' '-'কমান্ড ব্যবহার করে বৈধ নিয়ন্ত্রণ অক্ষর ব্যতীত অন্য প্রতিটি মুদ্রণ অক্ষর প্রতিস্থাপন করতে পারেন -। এবং আপনি দেখতে পাচ্ছেন একক অনুবাদ 3 টি বাইটের মতো অক্ষরে ---। মাল্টি-বাইট চরিত্রের জন্য ভাল পয়েন্ট।
αғsнιη

9

আপনি যদি ডাবল উদ্ধৃতি এবং সম্ভবত অন্যান্য অক্ষর রূপান্তর করতে চান তবে আপনি জিএনইউiconv ব্যবহার করতে পারেন :

$ iconv -f utf-8 -t ascii//translit < a
We're not a different species
"All alone?" Jeth mentioned.

//TRANSLITপ্রত্যয় বলে iconvযে লক্ষ্য এনকোডিং (এখানে হওয়া ASCII) এর থিয়েটারে ঐভাবে নাটক মঞ্চস্থ বাহিরে অক্ষরের জন্য, এটা অনুরূপ সুদর্শন অক্ষর বা সিকোয়েন্স স্বয়ংক্রিয়ভাবে প্রতিস্থাপন করতে পারেন। প্রত্যয় ব্যতীত, iconvএটি একটি অপ্রত্যাশিত চরিত্রটি খুঁজে পাওয়ার সাথে সাথে তা ত্যাগ করবে।

মনে রাখবেন যে //TRANSLITএটি একটি জিএনইউ এক্সটেনশন বলে মনে হচ্ছে: পসিক্সiconv এটি সমর্থন করে না।


+1 টি। আপনি যদি একটি পাঠ্যকে একটি অক্ষর সেট (বা এনকোডিং) থেকে অন্যটিতে রূপান্তর করেন তবে সেই উদ্দেশ্যে ডিজাইন করা কোনও সরঞ্জাম ব্যবহার করা বুদ্ধিমান হতে পারে।
রেডগ্রিটিব্রিক

@ ডালতাব আপনার সমাধানটি দ্বিগুণ উদ্ধৃতি চিহ্নগুলিও প্রতিস্থাপন করে যা ওপি সেগুলি প্রতিস্থাপন করতে চায় না।
αғsнιη

পছন্দ করেছেন
জারিত

3

আপনি এই awkসমাধানগুলির মধ্যে একটি ব্যবহার করতে পারেন :

awk '{gsub(/\xE2\x80\x99/, "\x27");print}' file # with Hex ASCII code

awk '{gsub(/’/, "\x27");print}' file

awk '{gsub(/\342\200\231/, "\47");print}'  file # with Octal ASCII code

awk '{gsub(/’/, "\47");print}' file

অথবা

awk '{gsub(/’/, "'"'"'");print}' file

0

এর -sবিকল্পগুলি ব্যবহার করুন tr :

$ echo "We’re not a different species"|tr -s "’" "'"
We're not a different species

থেকে man tr :

--truncate-set1
          first truncate SET1 to length of SET2

1
আপনার সমাধান এছাড়াও ডবল উদ্ধৃতি চিহ্ন যা ওপি তাদের প্রতিস্থাপন করতে না চান প্রতিস্থাপন
αғsнιη

আহ, প্রকৃতপক্ষে, এটি নির্দেশ করার জন্য ধন্যবাদ। আমি এই উত্তরটি রেফারেন্সের জন্য রেখে দেব।
স্কিপি লে গ্র্যান্ড গৌরও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.