ইউটিএফ -8 দিয়ে `কাট-সি` (` --characters`) ব্যবহার করতে পারবেন না?


15

কমান্ডটিতে cutবিকল্পগুলির -cসাথে বাইটের পরিবর্তে অক্ষরগুলিতে কাজ করার বিকল্প রয়েছে -b। তবে en_US.UTF-8স্থানীয়ভাবে এটি কার্যকর বলে মনে হচ্ছে না :

দ্বিতীয় বাইট দ্বিতীয় ASCII অক্ষর দেয় (যা ইউটিএফ -8 এ ঠিক একইভাবে এনকোড করা হয়েছে):

$ printf 'ABC' | cut -b 2          
B

তবে ইউটিএফ -8 লোকালে তিনটি গ্রীক নন-এএসসিআইআই অক্ষরের দ্বিতীয়টি দেয় না:

$ printf 'αβγ' | cut -b 2         
�

ঠিক আছে - এটি দ্বিতীয় বাইট
সুতরাং আমরা পরিবর্তে দ্বিতীয় চরিত্র তাকান :

$ printf 'αβγ' | cut -c 2 
�

দেখতে দেখতে ভাঙা লাগছে।
কিছু পরীক্ষা-নিরীক্ষার সাহায্যে দেখা যাচ্ছে যে পরিসীমাটি 3-4দ্বিতীয় চরিত্রটি দেখায়:

$ printf 'αβγ' | cut -c 3-4
β

তবে এটি 3 থেকে 4 এর বাইটের সমান:

$ printf 'αβγ' | cut -b 3-4
β

সুতরাং ইউটিএফ -8 এর -cচেয়ে বেশি নয় -b

আমি প্রত্যাশা করব লোকাল সেটআপটি ইউটিএফ -8 এর জন্য সঠিক নয়, তবে তুলনায়, wcপ্রত্যাশার মতো কাজ করে;
এটি প্রায়শই অপশন -c( --bytes) সহ বাইট গণনা করতে ব্যবহৃত হয় । (বিভ্রান্তিকর বিকল্পের নামগুলি নোট করুন))

$ printf 'αβγ' | wc -c
6

তবে এটি বিকল্প -m( --chars) সহ অক্ষরগুলিও গণনা করতে পারে , যা কেবল কাজ করে:

$ printf 'αβγ' | wc -m
3

সুতরাং আমার কনফিগারেশনটি ঠিক আছে বলে মনে হচ্ছে - তবে এটির জন্য বিশেষ cut

সম্ভবত এটি ইউটিএফ -8 সমর্থন করে না? তবে এটি বহু-বাইট অক্ষরকে সমর্থন করে বলে মনে হচ্ছে, অন্যথায় এটি সমর্থন করার প্রয়োজন হবে না -bএবং -c

তো, ভুল কি? এবং কেন?


লোকাল সেটআপটি utf8-র জন্য সঠিক দেখাচ্ছে, যতদূর আমি বলতে পারি:

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

ইনপুট, বাইট দ্বারা বাইট:

$ printf 'αβγ' | hd 
00000000  ce b1 ce b2 ce b3                                 |......|
00000006

মজাদার! দেখে মনে -cহচ্ছে এটি একই কোডটি ব্যবহার করছে -b। আপনি কি সোর্স কোডটি একবার দেখেছেন? সম্ভবত আপনি একটি ইঙ্গিতটি খুঁজে পেতে পারেন -cযা আসলে বোঝানো হয়েছে।
মিচাস

উত্তর:


13

আপনি কোনটি cutব্যবহার করছেন তা আপনি বলেননি , তবে আপনি যেহেতু জিএনইউর দীর্ঘ বিকল্পটি উল্লেখ করেছেন --charactersআমি এটি ধরে নেব। সেক্ষেত্রে এই উত্তরণটিinfo coreutils 'cut invocation' নোট করুন :

‘-c character-list’
‘--characters=character-list’

অক্ষর-তালিকায় তালিকাভুক্ত অবস্থানে কেবল অক্ষর মুদ্রণের জন্য নির্বাচন করুন। আপাতত একই-b , তবে আন্তর্জাতিকীকরণ এটি পরিবর্তন করবে।

(সামনে জোর দাও)

এই মুহুর্তের জন্য, জিএনইউ cutসর্বদা একক-বাইট "অক্ষরগুলির" ক্ষেত্রে কাজ করে, তাই আপনি যে আচরণটি দেখছেন এটি প্রত্যাশিত।


পসিক্সের জন্য দুটি -bএবং -cঅপশন উভয়কেই সমর্থন করা দরকার - এগুলি জিএনইউতে যুক্ত করা হয়নি cutকারণ এতে মাল্টি-বাইট সমর্থন ছিল এবং তারা সঠিকভাবে কাজ করেছে, তবে পসিএক্স-সম্মতিযুক্ত ইনপুটটিতে ত্রুটি দেওয়া এড়াতে। একই -cকিছু অন্যান্য মধ্যে সম্পন্ন করা হয়েছে cut, যদিও না বাস্তবায়নের, FreeBSD 'র ' s এবং OS X এর 'র অন্তত।

এই ঐতিহাসিক আচরণ এর -c-bবাইটের ভূমিকা নেওয়ার জন্য নতুনভাবে যুক্ত করা হয়েছিল যাতে -cমাল্টি-বাইট অক্ষরের সাথে কাজ করতে পারে। সম্ভবত কয়েক বছরে এটি ধারাবাহিকভাবে পছন্দসই হিসাবে কাজ করবে, যদিও অগ্রগতি ঠিক তত দ্রুত হয়নি (এটি ইতিমধ্যে এক দশক পেরিয়ে গেছে)। জিএনইউ cut এমনকি -nবিকল্পটি বাস্তবায়িত করে না , যদিও এটি অরথগোনাল এবং রূপান্তরটি সহায়তা করার উদ্দেশ্যে রয়েছে। পুরানো স্ক্রিপ্টগুলির সাথে সম্ভাব্য সামঞ্জস্যের সমস্যা রয়েছে, যা উদ্বেগের কারণ হতে পারে, যদিও এর কারণটি আমি নিশ্চিতভাবে জানি না।


1
ভাল কাজ. আপনি GNU এর trডক্সেও একই ধরণের মন্তব্য খুঁজে পাবেন । এমনকি tarআমি মিস্রিম্বার না করলেও । আমি এটি একটি বড় প্রকল্প অনুমান।
মাইক্রজারভ

ইউনিকোড প্রবলেমের জন্য কি কোনও কাজ আছে cut? উদাহরণস্বরূপ, প্যাচযুক্তগুলির জন্য উত্সগুলি ডাউনলোড করা কোথায় সম্ভব cut? বা অন্য ইউটিলিটি ব্যবহার করা আরও সহজ হবে? ( grepনীচের সমাধানগুলি পরিসীমা যেমন সহজেই কাজ করে না 5-8,44-49)
dma_k

এই 2017 টি নিবন্ধটি দেখুন, উপ-শিরোনামযুক্ত "GNU Coreutils এ মাল্টিবাইট এবং ইউনিকোড সমর্থন যোগ করার চলমান প্রচেষ্টা সম্পর্কিত র্যান্ডম নোট এবং পয়েন্টারগুলি : " ক্র্যাশকোর্স.হাউসগর্ডন.আর.গুটিওস-
মাল্টিবিটি- সাপোর্টপোর্ট

আপনি cut -cএখানে কিছু বিকল্প খুঁজে পেতে পারেন : superuser.com/questions/506164/…
myrdd

5

colrm(এর অংশটি util-linuxইতিমধ্যে বেশিরভাগ বিতরণে ইনস্টল করা উচিত) আন্তর্জাতিকীকরণকে আরও ভালভাবে পরিচালনা করতে পারে বলে মনে হয়:

$ echo 'αβγ' | colrm 3
αβ
$ echo 'αβγ' | colrm 2
α

নম্বরগুলি সম্পর্কে সতর্ক থাকুন: colrm Nথেকে কলামগুলি Nমুদ্রণ করা হবে, অবধি অক্ষর মুদ্রণ করা হবে N-1

( ক্রেডিট )


2

যেহেতু অনেকগুলি grepপ্রয়োগগুলি মাল্টবাইট-সচেতন তাই আপনি এর grep -oকয়েকটি ব্যবহার অনুকরণ করতেও ব্যবহার করতে পারেন cut -c

$ echo Τηεοδ29 | grep -o '^..'
Τη
$ echo Τηεοδ29 | egrep -o '^..' | grep -o '.$'
η

cutরেঞ্জগুলি অনুকরণ করতে পিরিয়ডের সংখ্যা সমন্বয় করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.