বাইট-অর্ডার চিহ্নটি সরাতে awk ব্যবহার করা


105

awkকোনও বিওএম অপসারণের জন্য কোনও স্ক্রিপ্ট (সম্ভবত একটি ওলাইনার) দেখতে কেমন লাগবে?

স্পেসিফিকেশন:

  • প্রথম ( NR > 1) পরে প্রতিটি লাইন মুদ্রণ করুন
  • প্রথম লাইনের জন্য: যদি এটি শুরু হয় #FE #FFবা হয় #FF #FEতবে সেগুলি সরিয়ে ফেলুন এবং বাকী মুদ্রণ করুন

উত্তর:


114

এটা চেষ্টা কর:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE

প্রথম রেকর্ডে (লাইন), বিওএম অক্ষরগুলি সরান। প্রতিটি রেকর্ড মুদ্রণ করুন।

বা কিছুটা সংক্ষিপ্ততর, এই জ্ঞানটি ব্যবহার করে যে সন্ত্রস্তে ডিফল্ট ক্রিয়াটি রেকর্ডটি মুদ্রণ করা হয়:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE

1 হ'ল সংক্ষিপ্ত শর্ত যা সর্বদা সত্যকে মূল্যায়ন করে, তাই প্রতিটি রেকর্ড মুদ্রিত হয়।

উপভোগ করুন!

- যোগ করুন -

ইউনিকোড বাইট অর্ডার মার্ক (বিওএম) এফএকিউতে প্রতিটি এনকোডিংয়ের জন্য সঠিক বিওএম বাইট তালিকাভুক্ত নীচে সারণি অন্তর্ভুক্ত রয়েছে:

Bytes         |  Encoding Form
--------------------------------------
00 00 FE FF   |  UTF-32, big-endian
FF FE 00 00   |  UTF-32, little-endian
FE FF         |  UTF-16, big-endian
FF FE         |  UTF-16, little-endian
EF BB BF      |  UTF-8

সুতরাং, উপরের টেবিল থেকে \xef\xbb\xbfআপনি দেখতে পারেন কীভাবে EF BB BF UTF-8বিওএম বাইটস।


1
দেখে মনে হচ্ছে সাব স্টেটমেন্টের মাঝখানে বিন্দুটি অনেক বেশি (কমপক্ষে আমার অ্যাডক এটি সম্পর্কে অভিযোগ করে)। এর পাশাপাশি এটি আমি যা অনুসন্ধান করেছি ঠিক সেটাই!
বোলডউইন

5
এই সমাধানটি কেবলমাত্র ইউটিএফ -8 এনকোডযুক্ত ফাইলগুলির জন্য কাজ করে। : অন্যদের জন্য, হল UTF-16 মত, উইকিপিডিয়া সংশ্লিষ্ট BOM উপস্থাপনা দেখতে en.wikipedia.org/wiki/Byte_order_mark
Boldewyn

2
সুতরাং: awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILEএবং নিশ্চিত করুন যে ইনফিল এবং আউটফাইল আলাদা!
স্টিভ ক্লে

1
আপনি যদি ব্যবহার করেন তবে আপনি perl -i.orig -pe 's/^\x{FFFE}//' badfileআপনার PERL_UNICODE এবং / অথবা PERLIO এনভোডিংয়ের জন্য envariables উপর নির্ভর করতে পারেন। PERL_UNICODE = SD ইউটিএফ -8 এর জন্য কাজ করবে; অন্যদের জন্য আপনার দরকার পার্লিও।
tchrist

1
সম্ভবত কিছুটা সংক্ষিপ্ত সংস্করণ:awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
সত্য

122

জিএনইউ sed(লিনাক্স বা সাইগউইনে) ব্যবহার করে:

# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt

ফ্রিবিএসডি তে:

sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt

জিএনইউ বা ফ্রিবিএসডি ব্যবহারের সুবিধা sed: -iপ্যারামিটারটির অর্থ "স্থানে", এবং পুনর্নির্দেশগুলি বা অদ্ভুত কৌশলগুলির প্রয়োজন ছাড়াই ফাইলগুলি আপডেট করবে।

ম্যাকে:

awkঅন্য উত্তরের এই সমাধানটি কাজ করে , তবে sedউপরের কমান্ডটি কাজ করে না। কমপক্ষে ম্যাক (সিয়েরা) sedডকুমেন্টেশনে হেক্সাডেসিমাল পালানোর আলাকে সমর্থন করার কথা উল্লেখ করা হয়নি \xef

মুর্টিলsponge থেকে সরঞ্জামটিতে পাইপ দিয়ে যে কোনও প্রোগ্রামের সাথে একই ধরণের কৌশলটি অর্জন করা যেতে পারে :

awk '…' INFILE | sponge INFILE

5
আমি দ্বিতীয় কমান্ডটি ম্যাক ওএস এক্স-তে যথাযথভাবে চেষ্টা করেছি এবং ফলাফলটি ছিল "সাফল্য", কিন্তু প্রতিস্থাপনটি আসলে ঘটেনি।
ট্রেজকাজ

1
উল্লেখ্য এই কমান্ডের একটি নির্দিষ্ট বাইট ক্রম, যা প্রতিস্থাপন মূল্য সম্ভব বাইট-অর্ডার-চিহ্ন এক । হতে পারে আপনার ফাইলে একটি আলাদা বিওএম ক্রম ছিল। (আমার কাছে ম্যাক না
থাকায়

3
আমি যখন কোনও ফাইলের ওএস এক্স-তে দ্বিতীয় কমান্ডটি বিওএম হিসাবে 0xef 0xbb 0xbf ব্যবহার করেছি, তখন বাস্তবে এটি প্রতিস্থাপন করেনি।
জন বুদ্ধিমান

ওএসএক্সে, আমি এখানে কেবল এখানে পার্লের
ইয়ান

ওএস এক্স এল ক্যাপিটেনে 10.11.6, এটি কাজ করে না, তবে অফিসিয়াল উত্তর stackoverflow.com/a/1068700/9636 ভাল কাজ করে।
সীমানা

42

বিশ্রী নয়, তবে আরও সহজ:

tail -c +4 UTF8 > UTF8.nobom

বিওএম পরীক্ষা করার জন্য:

hd -n 3 UTF8

বিওএম উপস্থিত থাকলে আপনি দেখতে পাবেন: 00000000 ef bb bf ...


6
বিওএমগুলি ইউটিএফ -16 এর জন্য 2 বাইট এবং ইউটিএফ -32 এর জন্য 4 বাইট এবং অবশ্যই কোনও ব্যবসা ইউটিএফ -8 এ প্রথম স্থানে নেই।
tchrist

2
পছন্দ করুন এর ব্যবহার বাঞ্ছনীয় নয়। এটা জিনিস ভাঙ্গা। এনকোডিংটি একটি উচ্চ-স্তরের প্রোটোকল দ্বারা নির্দিষ্ট করা উচিত।
tchrist

1
@ ট্রিস্ট: আপনার মানে এটি ভাঙ্গা জিনিসগুলি ভেঙে দেয়? :) যথাযথ অ্যাপ্লিকেশনগুলিকে সেই বিওএম পরিচালনা করতে সক্ষম হওয়া উচিত।
করলি হরবাথ

7
@ কারোলি হরভথ আমার অর্থ এটি প্রচুর প্রোগ্রাম ভেঙে দেয় । আমি কি বলেছি তাই না? আপনি যখন ইউটিএফ -16 বা ইউটিএফ -32 এনকোডিংগুলিতে একটি স্ট্রিম খুলেন, ডিকোডারটি বিওএম গণনা করতে জানে না। আপনি যখন ইউটিএফ -8 ব্যবহার করেন, ডিকোডাররা বিওএমকে ডেটা হিসাবে উপস্থাপন করে। এটি অসংখ্য প্রোগ্রামগুলিতে একটি সিনট্যাক্স ত্রুটি। এমনকি জাভা এর ডিকোডারও এইভাবে আচরণ করে, বাই ডিজাইন! ইউটিএফ -8 ফাইলের বিওএমগুলি ভুল জায়গায় স্থান দেওয়া হয়েছে এবং বাটটিতে ব্যথা রয়েছে: এগুলি একটি ত্রুটি! তারা অনেক কিছু ভেঙে দেয়। এমনকি ঠিক cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8ভেঙে যাবে। ইউটিএফ -8 এ কোনও বিওএম ব্যবহার করবেন না। সময়কাল।
tchrist

6
hdOS X এর (10.8.2 হিসাবে) উপলব্ধ নয়, তাই একটি জন্য চেক করতে হল UTF-8 BOM সেখানে আপনি নিম্নলিখিত ব্যবহার করতে পারেন: head -c 3 file | od -t x1
mklement0

21

dos2unixসিআরএলএফ লাইন প্রান্তটি এলএফ-তে রূপান্তরিত করার পাশাপাশি, বিওএমগুলিও সরিয়ে দেয়:

dos2unix *.txt

dos2unix এছাড়াও বিওএম ছাড়াই ইউটিএফ -16 ফাইলকে বিওএম ছাড়াই (তবে বিওএম ছাড়াই ইউটিএফ -16 ফাইল নয়) ইউটিএফ -8 এ বিওএম ছাড়ায় রূপান্তরিত করে:

$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
$ printf '\ufeffä\n'>bom-utf8
$ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
$ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
$ printf 'ä\n'>utf8
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be feff00e4000a
bom-utf16le fffee4000a00
   bom-utf8 efbbbfc3a40a
    utf16be 00e4000a
    utf16le e4000a00
       utf8 c3a40a
$ dos2unix -q *
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be c3a40a
bom-utf16le c3a40a
   bom-utf8 c3a40a
    utf16be 00e4000a
    utf16le e4000a00
       utf8 c3a40a

3

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

ব্যাচ রানার -> অনুসন্ধান (সাবফোল্ডারগুলিতে সমস্ত ফাইল সন্ধানের জন্য) -> টেমপ্লেট প্রতিস্থাপন করুন -> বাইনারি সরান বিওএম (এটির জন্য প্রস্তুত অনুসন্ধান এবং প্রতিস্থাপন টেমপ্লেট রয়েছে)।

এটি সবচেয়ে মার্জিত সমাধান ছিল না এবং এটির জন্য একটি প্রোগ্রাম ইনস্টল করা দরকার যা একটি নেতিবাচক দিক। তবে একবার আমার চারপাশে কী চলছে তা আমি জানতে পারি এটি একটি কবজির মতো কাজ করেছে (এবং বিওএমের সাথে থাকা প্রায় 2300 এর মধ্যে 3 টি ফাইল খুঁজে পেয়েছিল)।


1
আমি যখন আপনার সমাধানটি পেয়েছি তখন আমি খুব খুশী, তবে আমার কাছে কোম্পানির কম্পিউটারে সফ্টওয়্যার ইনস্টল করার সুযোগ নেই। আমি বিকল্পটি খুঁজে না পাওয়া পর্যন্ত আজ প্রচুর সময় নিয়েছি: পাইথনস্ক্রিপ্ট প্লাগইন সহ নোটপ্যাড ++ ব্যবহার করা। superuser.com/questions/418515/… যাইহোক ধন্যবাদ!
হোং লং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.