আরআর ত্রুটি: ম্যাক ওএস এক্সে অবৈধ বাইট সিকোয়েন্স


184

আমি আইওএসে ক্রস সংকলনের জন্য ম্যাক ওএস এক্সে মেকফিলের একটি স্ট্রিং প্রতিস্থাপন করার চেষ্টা করছি। স্ট্রিংটিতে ডাবল কোট এম্বেড করা আছে। আদেশটি হ'ল:

sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure

এবং ত্রুটিটি হ'ল:

sed: RE error: illegal byte sequence

আমি ডাবল উদ্ধৃতি, কমা, ড্যাশ এবং কোন আনন্দের সাথে কলোনগুলি পালানোর চেষ্টা করেছি। উদাহরণ স্বরূপ:

sed -i "" 's|\"iphoneos-cross\"\,\"llvm-gcc\:\-O3|\"iphoneos-cross\"\,\"clang\:\-Os|g' Configure

আমি ইস্যুটি ডিবাগ করার সময় হ্যাক করছি। কেউ কীভাবে sedঅবৈধ বাইট সিকোয়েন্সের অবস্থান মুদ্রণ করতে জানেন ? বা অবৈধ বাইট সিকোয়েন্স কি তা কি কেউ জানেন?


2
অবৈধ বাইট সিকোয়েন্সটি এমন কিছু শোনাচ্ছে যা আপনি 8-বিট আসকি খাওয়ানোর সময় পাবেন যা utf-8 প্রত্যাশা করে।
ক্লাস লিন্ডব্যাক

36
আপনি কি চেষ্টা করতে পারেন:LC_CTYPE=C && LANG=C && sed command
অনুভাভা

5
ধন্যবাদ লোকেরা এটা LANGজিনিস ছিল । দীর্ঘশ্বাস ....
jww

3
@ user2719058: বিএসডি sed(ওএস এক্স হিসাবে ব্যবহৃত) -i ''ব্যাকআপ ফাইল ব্যতীত স্থান আপডেটের জন্য (পৃথক, খালি-স্ট্রিং বিকল্প-যুক্তি) প্রয়োজন; গনুহ সঙ্গে sed, শুধুমাত্র -iনিজে কাজ করে - দেখতে stackoverflow.com/a/40777793/45375
mklement0

1
ল্যাং জিনিসটির জন্য প্লাস ওয়ান। ভাল দুঃখ, এটি অস্পষ্ট, অ-সুস্পষ্ট এবং আশ্চর্যজনকভাবে গবেষণা করা কঠিন।
স্পুদলি

উত্তর:


298

একটি নমুনা কমান্ড যা লক্ষণটি প্রদর্শন করে: sed 's/./@/' <<<$'\xfc'ব্যর্থ হয়, কারণ বাইটটি 0xfcবৈধ ইউটিএফ -8 চর নয়।
নোট করুন, বিপরীতে, জিএনইউ sed (লিনাক্স, তবে ম্যাকোএসে ইনস্টলযোগ্য) কেবল ত্রুটি না জানিয়েই অবৈধ বাইটটি পেরিয়ে যায়।

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

তবে, একই প্রভাবটি কেবলমাত্র একটি একক কমান্ডের জন্য অ্যাড-হক হতে পারে :

LC_ALL=C sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure

নোট: কি বিষয়ে একটি হল কার্যকর LC_CTYPE সেটিং C, তাই LC_CTYPE=C sed ...হবে স্বাভাবিকভাবে এছাড়াও কাজ, কিন্তু যদি LC_ALL(ব্যতীত অন্য কিছু সেট হতে হবে C), এটা ব্যক্তির ওভাররাইড করবে LC_*যেমন -category ভেরিয়েবল LC_CTYPE। সুতরাং, সবচেয়ে দৃ approach় পদ্ধতির সেট করা হয় LC_ALL

তবে, (কার্যকরভাবে) সেটিংস LC_CTYPE করতে Cএকইরূপে স্ট্রিং যেন প্রতিটি বাইট ছিল তার নিজস্ব চরিত্র ( কোন ব্যাখ্যা এনকোডিং নিয়মগুলি উপর ভিত্তি সঞ্চালিত হয়), সঙ্গে কোন বিষয়ে জন্য - multibyte-অন-ডিমান্ড - UTF-8 এনকোডিং যে OS X এর ডিফল্ট ভাবে নিয়োগ সেখানে বিদেশী অক্ষর আছে multibyte এনকোডিং

সংক্ষেপে: সেটিং LC_CTYPEকরারC কারণ শেল এবং ইউটিলিটি শুধুমাত্র অক্ষর মতো মৌলিক ইংরেজি অক্ষর (7-বিট হওয়া ASCII সীমার মধ্যে বেশী) চিনতে, যাতে বিদেশী অক্ষর। অক্ষর হিসাবে বিবেচনা করা হবে না , উদাহরণস্বরূপ, উপরের / ছোট হাতের রূপান্তর ব্যর্থ হয়।

যদি আপনি না প্রয়োজন আবার, এই জরিমানা হতে পারে মেলে যেমন multibyte এনকোডেড অক্ষর éএবং নিছক করতে চান মাধ্যমে যেমন অক্ষর পাস

যদি এটি অপর্যাপ্ত এবং / অথবা আপনি মূল ত্রুটির কারণ বুঝতে চান (কোন ইনপুট বাইটগুলি কী কারণে সমস্যাটি নির্ধারণ করে) এবং চাহিদা অনুযায়ী এনকোডিং রূপান্তর সম্পাদন করে তবে নীচে পড়ুন।


সমস্যাটি হ'ল ইনপুট ফাইলের এনকোডিংটি শেলের সাথে মেলে না।
আরও সুনির্দিষ্টভাবে, ইনপুট ফাইলটিতে এমনভাবে এনকোড করা অক্ষর রয়েছে যা ইউটিএফ -8 এ বৈধ নয় (যেমন @ ক্লাস লিন্ডব্যাক একটি মন্তব্যে বলেছিলেন) - sedত্রুটি বার্তাটি এটি বলতে চেষ্টা করছে invalid byte sequence

সম্ভবত, আপনার ইনপুট ফাইলটিতে একটি ওয়েল -বাইট 8-বিট এনকোডিং যেমন ISO-8859-1, "ওয়েস্টার্ন ইউরোপীয়" ভাষাগুলি এনকড করার জন্য প্রায়শই ব্যবহৃত হয় uses

উদাহরণ:

উচ্চারণযুক্ত চিঠিতে àইউনিকোড কোডপয়েন্ট 0xE0(224) রয়েছে - যা একইভাবে রয়েছে ISO-8859-1। তবে, ইউটিএফ -8 এনকোডিংয়ের প্রকৃতির কারণে , এই একক কোডপয়েন্টটি 2 বাইট হিসাবে উপস্থাপিত হয় - 0xC3 0xA0যেখানে পাস করার চেষ্টা করা হচ্ছে একক বাইট 0xE0 হয় অবৈধ হল UTF-8 করেন।

এখানে একটি ব্যাপার সমস্যা বিক্ষোভের স্ট্রিং ব্যবহার করে voilàযেমন এনকোড ISO-8859-1সঙ্গেà হিসাবে প্রতিনিধিত্ব এক (একটি ANSI-সি-উদ্ধৃত ব্যাশ স্ট্রিং (মাধ্যমে বাইট $'...') যে ব্যবহারসমূহ \x{e0}বাইট তৈরি করতে):

নোট করুন যে sedকমান্ডটি কার্যকরভাবে একটি অন-অপশন যা সহজেই ইনপুটটি পাস করে তবে আমাদের ত্রুটিটি উস্কে দেওয়ার প্রয়োজন:

  # -> 'illegal byte sequence': byte 0xE0 is not a valid char.
sed 's/.*/&/' <<<$'voil\x{e0}'

কেবল সমস্যাটিকে উপেক্ষা করার জন্য , উপরেরLCTYPE=C পদ্ধতির ব্যবহার করা যেতে পারে:

  # No error, bytes are passed through ('á' will render as '?', though).
LC_CTYPE=C sed 's/.*/&/' <<<$'voil\x{e0}'

আপনি যদি নির্ধারণ করতে চান যে ইনপুটটির কোন অংশগুলি সমস্যা তৈরি করে , তবে নিম্নলিখিতগুলি চেষ্টা করুন:

  # Convert bytes in the 8-bit range (high bit set) to hex. representation.
  # -> 'voil\x{e0}'
iconv -f ASCII --byte-subst='\x{%02x}' <<<$'voil\x{e0}'

আউটপুট আপনাকে হেক্সাডেসিমাল আকারে উচ্চ বিট সেট (বাইটস যা--বিট এএসসিআইআই রেঞ্জ ছাড়িয়েছে) রয়েছে এমন সমস্ত বাইট দেখিয়ে দেবে। (দ্রষ্টব্য, তবে এটিতে সঠিকভাবে এনকোডযুক্ত ইউটিএফ -8 মাল্টিবাইট সিকোয়েন্সও রয়েছে - বিশেষত অবৈধ-ইন-ইউটিএফ -8 বাইট চিহ্নিত করার জন্য আরও পরিশীলিত পদ্ধতির প্রয়োজন হবে))


চাহিদার ভিত্তিতে এনকোডিং রূপান্তর সম্পাদন করা হচ্ছে :

স্ট্যান্ডার্ড ইউটিলিটি iconv( -t) এবং / অথবা থেকে রূপান্তর করতে ব্যবহার করা যেতে পারে-f ) এনকোডিংগুলিতে ; iconv -lসমস্ত সমর্থিত তালিকাভুক্ত করে।

উদাহরণ:

উপরের উদাহরণের ISO-8859-1উপর ভিত্তি করে শেল (ভিত্তিতে LC_CTYPE, যা UTF-8পূর্বনির্ধারিত রয়েছে) তে কার্যকর এনকোডিংয়ে FROM রূপান্তর করুন :

  # Converts to UTF-8; output renders correctly as 'voilà'
sed 's/.*/&/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"

নোট করুন যে এই রূপান্তরটি আপনাকে বিদেশী চরিত্রগুলির সাথে সঠিকভাবে মেলে :

  # Correctly matches 'à' and replaces it with 'ü': -> 'voilü'
sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"

ISO-8859-1প্রসেসিংয়ের পরে ইনপুটটিকে BACK এ রূপান্তর করতে , কেবল ফলাফলটিকে অন্য iconvকমান্ডে পাইপ করুন :

sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')" | iconv -t ISO-8859-1

4
আমি বলব এটি একটি আরও ভাল বিকল্প। প্রথমত, আমি টার্মিনালের সমস্তগুলিতে বহু-ভাষা সমর্থন হারাতে চাই না। দ্বিতীয়ত, গৃহীত উত্তরটি স্থানীয় সমস্যার বিশ্বব্যাপী সমাধানের মতো মনে হয় - এমন কিছু এড়ানো উচিত।
অ্যালেক্স

এটিতে আমার কয়েকটি ছোট ছোট টুইট হয়েছে। আমি প্রতিক্রিয়া প্রশংসা করব। stackoverflow.com/a/35046218/9636
সীমানা

LC_CTYPE=C sed 's/.*/&/' <<<$'voil\x{e0}'সিয়েরায় sed: RE error: illegal byte sequenceআমার জন্য প্রিন্ট করুন echo $LC_ALLআউটপুট en_US.UTF-8FWIW।
আহকক্স

1
@ অহকক্স: হ্যাঁ, কারণ সেটিং উত্তরে বর্ণিত হিসাবে অন্যান্য সমস্ত ভেরিয়েবলকে LC_ALL ওভাররাইড করেLC_*LC_CTYPE
mklement0

2
@ mklement0 শীতল, এটি কাজ করে: "এলসি_এলএল = সি সেড এস /.. / & / '<<< $' ভয়েল \ x {ই0} '"। অগ্রগতিটি
আহকক্স

142

আপনার ~/.bash_profileবা ~/.zshrcফাইলগুলিতে নিম্নলিখিত লাইনগুলি যুক্ত করুন ।

export LC_CTYPE=C 
export LANG=C

29
এটি আসলে কাজ করে তবে আপনি দয়া করে কেন ব্যাখ্যা করতে পারেন?
হোয়াং ফ্যাম

11
@ হোয়াংফাম: স্ট্রিংগুলিতে প্রতিটি বাইটকে কোনও এনকোডিং বিধি প্রয়োগ না করে তার নিজস্ব চরিত্র হিসাবে স্থাপনের কারণে সেট LC_CTYPEকরা C। যেহেতু (ইউটিএফ -8) এনকোডিং বিধি লঙ্ঘনের ফলে আসল সমস্যা দেখা দিয়েছে তাই সমস্যাটি দূরে সরে যায়। তবে, আপনি যে মূল্য দিচ্ছেন তা হ'ল শেল এবং ইউটিলিটিগুলি কেবলমাত্র প্রাথমিক ইংরেজি বর্ণগুলি (--বিট এএসসিআইআই রেঞ্জের একটি) অক্ষর হিসাবে স্বীকৃতি দেয়। আরও উত্তর জন্য আমার উত্তর দেখুন।
mklement0

6
আপনার শেলের শুরু ফাইলগুলিতে এটিকে স্থায়ীভাবে সেট করা অনেক কার্যকর আচরণ অক্ষম করবে। আপনি এটি কেবলমাত্র পৃথক কমান্ডের জন্য রাখতে চান যা একেবারেই এটির প্রয়োজন।
ট্রিপলি

4
খুব বিপজ্জনক অপ্রত্যাশিত পরিণতি হতে পারে। কেউ ব্যবহার করতে পারে LC_CTYPE=C sed …, কেবলমাত্র সেড কমান্ডে।
ইওংওয়ে উ

2
এটি আপনার শেলের ইউনিকোড অক্ষরের সমর্থন সম্পূর্ণরূপে অক্ষম করবে। বিদায় ইমোজিস, অভিনব রেখার অঙ্কন চরিত্র, উচ্চারণ সহ চিঠিপত্র, .... কেবলমাত্র অন্য উত্তরগুলিতে বর্ণিত হিসাবে কেবল সেড কমান্ডের জন্য এটি সেট করা আরও ভাল।
asmeurer

6

আমার কাজটি পার্ল ব্যবহার করছিল:

find . -type f -print0 | xargs -0 perl -pi -e 's/was/now/g'

এই এক দুর্দান্ত কাজ করে। এবং অন্যদের থেকে আলাদা না হয়ে বিশেষ চরিত্রগুলি এড়াতে আমার কোনও ত্রুটি হয়নি। পূর্ববর্তীগুলি আমাকে "সেড: আরআর ত্রুটি: অবৈধ বাইট সিকোয়েন্স" বা সেডের মতো বিষয় দিয়েছে: 1: "পাথ_টো_ফাইল": অবৈধ কমান্ড কোড।
JMags1632

3

mklement0 এর উত্তর দুর্দান্ত তবে আমার কিছু ছোট টুইট রয়েছে।

এটি bashব্যবহার করার সময় স্পষ্টভাবে এনকোডিং নির্দিষ্ট করা ভাল ধারণা বলে মনে হচ্ছে iconv। এছাড়াও, আমাদের একটি বাইট-অর্ডার চিহ্নটি প্রিপেন্ড করা উচিত ( যদিও ইউনিকোড স্ট্যান্ডার্ড এটির প্রস্তাব দেয় না ) কারণ বাইট-অর্ডার চিহ্ন ছাড়া ইউটিএফ -8 এবং এএসসিআইআইয়ের মধ্যে বৈধ বিভ্রান্তি থাকতে পারে । দুর্ভাগ্যক্রমে, iconvআপনি যখন স্পষ্টভাবে একটি এডিয়েননেস ( UTF-16BEবা UTF-16LE) নির্দিষ্ট করেন তখন কোনও বাইট-অর্ডার চিহ্নটি তৈরি করে না , তাই আমাদের ব্যবহার করা দরকার UTF-16, যা প্ল্যাটফর্ম-নির্দিষ্ট অন্তর্নিহিততা ব্যবহার file --mime-encodingকরে এবং তারপরে সত্যিকারের শেষ আবিষ্কার করতে ব্যবহার করতে হবেiconv ব্যবহৃত ।

(আমি আমার সমস্ত এনকোডিংকে বড়হেতু বড় করি কারণ আপনি যখন iconvসমর্থিত সমস্ত এনকোডিংগুলির সাথে তালিকাবদ্ধ করেন iconv -lসেগুলি সমস্ত বড় হয় erc)

# Find out MY_FILE's encoding
# We'll convert back to this at the end
FILE_ENCODING="$( file --brief --mime-encoding MY_FILE )"
# Find out bash's encoding, with which we should encode
# MY_FILE so sed doesn't fail with 
# sed: RE error: illegal byte sequence
BASH_ENCODING="$( locale charmap | tr [:lower:] [:upper:] )"
# Convert to UTF-16 (unknown endianness) so iconv ensures
# we have a byte-order mark
iconv -f "$FILE_ENCODING" -t UTF-16 MY_FILE > MY_FILE.utf16_encoding
# Whether we're using UTF-16BE or UTF-16LE
UTF16_ENCODING="$( file --brief --mime-encoding MY_FILE.utf16_encoding )"
# Now we can use MY_FILE.bash_encoding with sed
iconv -f "$UTF16_ENCODING" -t "$BASH_ENCODING" MY_FILE.utf16_encoding > MY_FILE.bash_encoding
# sed!
sed 's/.*/&/' MY_FILE.bash_encoding > MY_FILE_SEDDED.bash_encoding
# now convert MY_FILE_SEDDED.bash_encoding back to its original encoding
iconv -f "$BASH_ENCODING" -t "$FILE_ENCODING" MY_FILE_SEDDED.bash_encoding > MY_FILE_SEDDED
# Now MY_FILE_SEDDED has been processed by sed, and is in the same encoding as MY_FILE

1
++ সহায়ক কৌশলগুলির জন্য, বিশেষত file -b --mime-encodingকোনও ফাইলের এনকোডিংটি আবিষ্কার এবং প্রতিবেদন করার জন্য। সম্বোধনের কিছু দিক রয়েছে, যা আমি পৃথক মন্তব্যে করব।
mklement0

2
আমি মনে করি এটি নিরাপদে বলেছে যে ইউনিক্স বিশ্বটি এই মুহুর্তে ইউটিএফ -8 গ্রহণ করেছে: ডিফল্ট LC_CTYPEমানটি সাধারণত <lang_region>.UTF-8তাই কোনও বিওএম (বাইট-অর্ডার চিহ্ন) ছাড়াই কোনও ফাইলকে ইউটিএফ -8 ফাইল হিসাবে ব্যাখ্যা করা হয়। এটা শুধুমাত্র হয় উইন্ডোজ বিশ্বের যে সিউডো-BOM 0xef 0xbb 0xff ব্যবহার করা হয়; সংজ্ঞা অনুসারে, ইউটিএফ -8 এর একটি বিওএম প্রয়োজন হয় না এবং এটি প্রস্তাবিত হয় না (যেমন আপনি বলেছেন); উইন্ডোজ বিশ্বের বাইরে, এই সিউডো-বিওএম জিনিসগুলি ভাঙ্গার কারণ করে ।
mklement0

2
পুনরায় Unfortunately, iconv doesn't prepend a byte-order mark when you explicitly specify an endianness (UTF-16BE or UTF-16LE): এটি ডিজাইনের দ্বারা: যদি আপনি স্পষ্টভাবে শেষের দিকটি নির্দিষ্ট করে থাকেন তবে এটি কোনও বিওএমের মাধ্যমে প্রতিফলিত করারও দরকার নেই, তাই কোনওটিই যুক্ত হয় না।
mklement0

1
পুনরায় LC_*/ LANGভেরিয়েবল: bash,, kshএবং zsh(সম্ভবত অন্যরা, তবে নয় dash ) অক্ষর এনকোডিংকে সম্মান করে; ইউটিএফ -8-ভিত্তিক লোকেলের সাথে পসিক্সের মতো শেলগুলিতে যাচাই করুন v='ä'; echo "${#v}": একটি ইউটিএফ -8 সচেতন শেলটি রিপোর্ট করা উচিত 1; অর্থাত্, এটি একক অক্ষর হিসাবে একাধিক-বাইট ক্রম ä( 0xc3 0xa4) স্বীকৃতি দেয় । সম্ভবত আরও বেশি গুরুত্বপূর্ণ হল, কিন্তু: মান ইউটিলিটি ( , , , ...) এছাড়াও লোকেল হতে / এনকোডিং-সচেতন হবে, এবং যখন সবচেয়ে তাদের আধুনিক ইউনিক্স-সদৃশ মাধ্যম, সেখানে যেমন ব্যতিক্রম হয় ওএসএক্স উপর, এবং লিনাক্সে। sedawkcutawkcut
এমকেলেট 0

1
এটি প্রশংসনীয় যে fileইউটিএফ -8 সিউডো-বিওএমকে স্বীকৃতি দেয় তবে সমস্যাটি হ'ল বেশিরভাগ ইউনিক্স ইউটিলিটিগুলি যে ফাইলটি প্রসেস করে না এবং সাধারণত বিরতি বা কমপক্ষে দুর্ব্যবহার করে যখন এটির মুখোমুখি হয়। কোনও বিওএম ছাড়াই, fileএকটি অল---বিট বাইট ফাইলকে ASCII হিসাবে সঠিকভাবে চিহ্নিত করে এবং বৈধ ইউটিএফ -8 মাল্টি-বাইট অক্ষরকে ইউটিএফ -8 হিসাবে চিহ্নিত করে। হল UTF-8 সৌন্দর্য যে এটি একটি হল সুপারসেটও (কিন্তু তদ্বিপরীত নয়) কোনো বৈধ হওয়া ASCII ফাইলটি একটি বৈধ হল UTF-8 ফাইল সংজ্ঞা দ্বারা হয়;: ASCII এর কোনও ASCII ফাইলটিকে ইউটিএফ -8 হিসাবে বিবেচনা করা পুরোপুরি নিরাপদ (এটি প্রযুক্তিগতভাবে এটি কেবল কোনও মাল্টি বাইট অক্ষর ধারণ করে না
happens

2

আপনি কেবল পাইপ একটি আছে iconv আগে কমান্ড sed কমান্ড। File.txt ইনপুট সহ প্রাক্তন:

iconv -f ISO-8859-1 -t UTF8-MAC file.txt | সেড 's / কিছু / àéèêçùû / ছ' | .....

-f বিকল্পটি 'থেকে' কোডসেট এবং -t বিকল্পটি 'থেকে' কোডসেট রূপান্তর।

মামলার যত্ন নিন, ওয়েব পৃষ্ঠাগুলি সাধারণত যে ভালো ছোট হাতের অক্ষরে দেখান <অক্ষরসেট = iso- 8859-1 "/> এবং iconv বড়হাতের ব্যবহার করে। আপনি এর তালিকা আছে iconv আপনি আদেশের সঙ্গে সিস্টেম সমর্থিত codesets iconv -l

ইউটিএফ 8-ম্যাক রূপান্তরকরণের জন্য আধুনিক ওএস ম্যাক কোডসেট set


আরো দেখুন iconv এবং অক্ষরসেট নাম iconv মেইলিং তালিকা।
jww

1

কেউ কীভাবে অবৈধ বাইট সিকোয়েন্সের অবস্থান মুদ্রণ করতে শেড পেতে জানেন? বা অবৈধ বাইট সিকোয়েন্স কি তা কি কেউ জানেন?

$ uname -a
Darwin Adams-iMac 18.7.0 Darwin Kernel Version 18.7.0: Tue Aug 20 16:57:14 PDT 2019; root:xnu-4903.271.2~2/RELEASE_X86_64 x86_64

আমি কেবল টিআর ব্যবহার করে উপরের উত্তর দেওয়ার উপায়ের অংশ পেয়েছি ।

আমার কাছে একটি .csv ফাইল রয়েছে যা ক্রেডিট কার্ডের বিবৃতি এবং আমি এটিকে Gnucash এ আমদানি করার চেষ্টা করছি। আমি সুইজারল্যান্ডে অবস্থিত তাই জুরিখের মতো শব্দ ব্যবহার করতে হবে। জেনুকাশকে সন্দেহ করা সংখ্যার ক্ষেত্রে "" পছন্দ করে না, আমি কেবল সমস্ত প্রতিস্থাপন করার সিদ্ধান্ত নিয়েছি

; ;

সঙ্গে

;;

এখানে যায়:

$ head -3 Auswertungen.csv | tail -1 | sed -e 's/; ;/;;/g'
sed: RE error: illegal byte sequence

আমি কিছু আলোকপাত করতে ওড ব্যবহার করেছি : এই ওড-সি আউটপুটটির নীচে 374 টি নোট করুন

$ head -3 Auswertungen.csv | tail -1 | od -c
0000000    1   6   8   7       9   6   1   9       7   1   2   2   ;   5
0000020    4   6   8       8   7   X   X       X   X   X   X       2   6
0000040    6   0   ;   M   Y       N   A   M   E       I   S   X   ;   1
0000060    4   .   0   2   .   2   0   1   9   ;   9   5   5   2       -
0000100        M   i   t   a   r   b   e   i   t   e   r   r   e   s   t
0000120                Z 374   r   i   c   h                            
0000140    C   H   E   ;   R   e   s   t   a   u   r   a   n   t   s   ,
0000160        B   a   r   s   ;   6   .   2   0   ;   C   H   F   ;    
0000200    ;   C   H   F   ;   6   .   2   0   ;       ;   1   5   .   0
0000220    2   .   2   0   1   9  \n                                    
0000227

তারপর আমি ভাবলাম প্ররোচিত করার চেষ্টা করতে পারে TR যাই হোক না কেন সঠিক বাইট কোড জন্য 374 প্রতিস্থাপন করতে। তাই প্রথমে আমি সাধারণ কিছু চেষ্টা করেছিলাম যা কার্যকর হয়নি, তবে ঝামেলা বাইট কোথায় ছিল তা আমাকে দেখানোর পার্শ্ব প্রতিক্রিয়া ছিল:

$ head -3 Auswertungen.csv | tail -1 | tr . .  ; echo
tr: Illegal byte sequence
1687 9619 7122;5468 87XX XXXX 2660;MY NAME ISX;14.02.2019;9552 - Mitarbeiterrest   Z

আপনি টিআর বেলগুলি 374 অক্ষরে দেখতে পাচ্ছেন ।

পার্ল ব্যবহার করা এই সমস্যাটি এড়াতে পারে বলে মনে হচ্ছে

$ head -3 Auswertungen.csv | tail -1 | perl -pne 's/; ;/;;/g'
1687 9619 7122;5468 87XX XXXX 2660;ADAM NEALIS;14.02.2019;9552 - Mitarbeiterrest   Z?rich       CHE;Restaurants, Bars;6.20;CHF;;CHF;6.20;;15.02.2019

0

আমার কাজের অংশ gnu ব্যবহার করা হয়েছে sed। আমার উদ্দেশ্যে ভাল কাজ করে।


প্রকৃতপক্ষে, জিএনইউ sed হ'ল একটি বিকল্প যদি আপনি ইনপুট স্ট্রিমের অবৈধ বাইটগুলি অগ্রাহ্য করতে চান (কাজ করার প্রয়োজন নেই LC_ALL=C sed ...), কারণ জিএনইউ sedকেবল ত্রুটি প্রতিবেদন করার পরিবর্তে অবৈধ বাইটগুলি অতিক্রম করে, তবে মনে রাখবেন যে আপনি যদি সঠিকভাবে সনাক্ত করতে চান এবং সমস্ত প্রক্রিয়া করতে চান ইনপুট স্ট্রিংয়ের অক্ষরগুলি, ইনপুটটির এনকোডিং প্রথমে পরিবর্তন করার কোনও উপায় নেই (সাধারণত, সহ iconv)।
mklement0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.