আমি কীভাবে কোনও ইউটিএফ -8 ফাইল থেকে বিওএম সরিয়ে ফেলতে পারি?


63

বিওএম-এর সাথে ইউটিএফ -8 এনকোডিংয়ে আমার একটি ফাইল আছে এবং আমি বিওএমটি সরাতে চাই। ফাইল থেকে বিওএম সরানোর জন্য কি কোনও লিনাক্স কমান্ড-লাইন সরঞ্জাম রয়েছে?

$ file test.xml
test.xml:  XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines


1
আমি মাত্র কয়েক মাস আগে এটি করার জন্য একটি অত্যন্ত সহজ সরঞ্জাম তৈরি করেছি: oskog97.com/read/?path=/small-scriptts/killbom&referer=/… / usr / স্থানীয় / বিনে এর মতো কিছু ইনস্টল করার উপযুক্ত হতে পারে যদি আপনার কাছে বিওএম সহ অনেকগুলি ইউটিএফ -8 এনকোডযুক্ত ফাইল রয়েছে।
ওসকার স্কোগ

উত্তর:


76

আপনি যদি নিশ্চিত না হন যে ফাইলটিতে কোনও ইউটিএফ -8 বিওএম রয়েছে, তবে এটি (জিএনইউ এর বাস্তবায়ন অনুমান করে sed) বিওএম বিদ্যমান থাকলে তা মুছে ফেলবে, না থাকলে তা পরিবর্তন করবে না।

sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt

আপনি -iবিকল্পটি দিয়ে বিদ্যমান ফাইলটি ওভাররাইট করতে পারেন :

sed -i '1s/^\xEF\xBB\xBF//' orig.txt

4
এটি কোনও utf8 লোকালে কাজ করতে পারে না, তবে সি বা পিক্সিতে লোকাল ওভাররাইড প্রেরণ সবসময় কাজ করবে।
hildred

3
@ ছোট্ট আমি en_US.UTF-8লোকেলের সাথে এটি পরীক্ষা করেছি এবং এটি কার্যকর হয়েছে worked কখন ব্যর্থ হবে?
এম 13 ই

2
@ এম 13 আর, এটি সেড এবং সংকলন বিকল্পগুলির সংস্করণের উপর নির্ভর করে। ব্যর্থতার ক্ষেত্রে ইউনিকোড চরিত্রের ক্লাসগুলির সাথে সেডের একটি খুব নতুন সংস্করণ তিনটি বাইট ক্রমকে একক অক্ষর হিসাবে নিয়ে আসবে যা তিনটি অক্ষরের অনুক্রমের সাথে মেলে না। তবে এই ক্ষেত্রে আপনি একটি ষোল বিট চরিত্রের ম্যাচ করতে পারেন। তবে এটি একটি নতুন বৈশিষ্ট্য এবং সর্বজনীনভাবে উপস্থিত নয়। আপনি যদি পরীক্ষা করতে চান তবে আমি সর্বশেষ সংস্করণটি সংকলন করার পরামর্শ দিচ্ছি।
hildred

4
একটি ইউনিকোড-সক্ষম সেড দিয়ে কাজ করতে এটি ঠিক করতে LC_ALL = C সেড '1s / \ \ xEF \ xBB \ xBF //'
জোশুয়া

@ সিএসএম দুর্দান্ত, তবে একটি বিশেষ ক্ষেত্রে এটি কাজ করে না: বেভোর: -<U+FEFF>\chapter{xxx}পরে: +\chapter{xxx}^M ব্যাখ্যা: ক্ষীর-ফাইলে টাইপসের জন্য এমএস-শব্দ ব্যবহার করা। লিনাক্সের অধীনে লেটেক্স উল্লেখ করা ত্রুটিগুলি দেখায়। আউটপুট একটি গিট সিস্টেম থেকে হয়। এই বিশেষ কেসটি ধরতে আমি কীভাবে ভাবটি পরিবর্তন করতে পারি?
কাটন আই

64

ইউটিএফ -8-তে কোনও বিওএম বোঝায় না। এগুলি সাধারণত মাইক্রোসফ্ট ওএসে বোগাস সফ্টওয়্যার দ্বারা ভুলভাবে যুক্ত হয়।

dos2unix এটি মুছে ফেলা হবে এবং উইন্ডোজ পাঠ্য ফাইলগুলির অন্যান্য আইডিয়াসক্র্রেসিগুলির যত্নও নেবে।

dos2unix test.xml

17
আমি সম্মত হলাম যে কোনও ইউটিএফ -8 এনকোডেড বিওএম কোনও তাত্পর্যপূর্ণ নয়, তবে বিশ্বাস করুন বা না করুন, এমন অনেক লোক আছেন যারা মনে করেন যে এটি দুর্দান্ত ধারণা যা অন্যান্য 8-বিট এনকোডিংগুলি থেকে ইউটিএফ -8 কে পৃথক করতে সহায়তা করে। তাই এটি স্বাদের বিষয়। উইন্ডোজ নোটপ্যাড উদ্দেশ্যে একটি বিওএম যুক্ত করেছে।
জোহান ম্যারেইন

17
এটি কীভাবে বোঝায় বা না বুঝে কী আসে যায়, যখন প্রসঙ্গটি কীভাবে এটি অপসারণ করা যায় কেবল প্রশ্ন? উইকিপিডিয়া অনুসারে, নোটপ্যাডের কোনও ফাইলকে ইউটিএফ -8 হিসাবে স্বীকৃতি দেওয়ার জন্য বিওএমের প্রয়োজন, এবং গুগল ডক্সও ফাইলটিকে পাঠ্য হিসাবে রফতানি করার সময় এটি যুক্ত করে। আমি সন্দেহ করি তারা সকলেই ভুল করে এটি করে ।
ইলক্কাছু

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
টেরডন

1
লাইন এন্ডিংগুলিকে রূপান্তর না করে এবং কেবল বিওএমকে দিয়ে সরানোর কোনও উপায় আছে dos2unix?
এম

2
@ m13r এরপরে এই উত্তরে সেড স্ক্রিপ্টটি ব্যবহার করুন । এটি কেবল বোম সরিয়ে ফেলবে (যদি এটি বিদ্যমান থাকে), অন্য কিছুই পরিবর্তন করা হবে না।
তীর

25

tailকমান্ডটি দিয়ে কোনও ফাইল থেকে বিওএম সরিয়ে ফেলা সম্ভব :

tail -c +4 withBOM.txt > withoutBOM.txt

2
4 কেন? বিওএম-তে 3 বাইট রয়েছে।
ডিভেন্টফ্যান

10
@ ডিভিয়ান্টফ্যান যে কারণে আপনি যদি এড়াতে চান তবে আপনাকে 4 র্থ বাইটে শুরু করা দরকার।
স্টাফেন চেজেলাস

9
tail1 ভিত্তিক সূচক ব্যবহার করছে ?! ডব্লিউটিএফ!
কোডসইনচওস

5
@ কোডসইনচাউস, tail -c -1বা tail -c 1(যা tailসাধারণত ব্যবহৃত হয়) হ'ল tail -c +1প্রথম বাইট দিয়ে শুরু করা শেষ বাইট দিয়ে শুরু করা সামগ্রী । tail -c 0/ tail -c +0এটির জন্য আরও অনেক অনিচ্ছাকৃত হবে।
স্টাফেন চেজেলাস

2
@deviantfan: (dd bs=1 count=3 of=/dev/null; cat) <input >output। বা জিএনইউ সহ (head -c3 >/dev/null; cat)- এমনকি ইউটিএফ 8 বা অন্যান্য নন-সিঙ্গলবাইট লোকালেও; জিএনইউ হেড 'চর' = বাইট করে।
dave_thompson_085

20

ভিআইএম ব্যবহার করছি

  1. ভিআইএম-তে ফাইল খুলুন:

    vi text.xml
    
  2. বিওএম এনকোডিং সরান:

    :set nobomb
    
  3. সংরক্ষণ করুন এবং প্রস্থান করুন:

    :wq
    

অদ্ভুতভাবে ম্যাকের উপর ভিআইএম 8 দিয়ে, আমার কাছে এক্সেলের তৈরি সিএসভি ইউটিএফ -8 ফাইল রয়েছে এবং এটি দিয়ে শুরু হয় <feff>, তবুও :set nobombএটি কোনও পরিবর্তন বা সরাবে না।
dlamblin

5

তুমি ব্যবহার করতে পার

LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename

ফাইলের শুরু থেকে বাইট অর্ডার চিহ্নটি সরিয়ে ফেলতে, যদি তা থাকে তবে সেই সাথে কোনও সিআর এলএফ নিউলাইনগুলি কেবল এলএফতে রূপান্তর করে। LANG=C LC_ALL=Cশেল কমান্ড ডিফল্ট সি লোকেল (ডিফল্ট POSIX লোকেল নামে পরিচিত), যেখানে বাইট অর্ডার মার্ক বিরচন তিন বাইট বাইট হিসাবে গণ্য করা হয় চালাতে চান বলে। -iSed করার অপশন ইন-জায়গা মানে। আপনি যদি ব্যবহার করেন -i.oldতবে সেড মূল ফাইলটি filename.oldএবং নতুন ফাইলটিকে (যদি কোনও পরিবর্তন করে তবে) সংরক্ষণ করে filename


আমি ব্যক্তিগতভাবে এটিকে পছন্দ করতে চাই ~/bin/fix-ms; উদাহরণস্বরূপ, হিসাবে

#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
    for FILE in "$@" ; do
        sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
    done
else
    exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi

যাতে আমার যদি সমস্ত সি উত্স ফাইল এবং শিরোনাম বলতে (এমএস-ডস যুগের আমার পুরানো কোড, উদাহরণস্বরূপ!) বলতে এটি প্রয়োগ করতে হয় তবে আমি কেবল চালাচ্ছি

find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix

বা, আমি যদি কেবল কোনও ফাইলটি পরিবর্তন না করেই কেবল এটি দেখতে চাই তবে আমি চালাতে পারি

~/bin/ms-fix < filename | less

এবং <U+FEFF>আমার ইউটিএফ -8 টার্মিনালে কুরুচিপূর্ণ দেখতে পাবে না ।


কেন সহজভাবে নয় sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"?
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলাস: কারণ আমি চাই যে প্রতিস্থাপনের ক্ষেত্রে কোনও সমস্যা আছে, যা sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"না করে যদি স্ক্রিপ্টটি অবিলম্বে প্রস্থান করা হয় ; এটি একটি প্রস্থান কোড ফেরত দেয় তবে এটি প্রস্থান করার আগে যুক্তি তালিকায় তালিকাভুক্ত সমস্ত ফাইলকে প্রক্রিয়া করে।
নামমাত্র প্রাণী 14

@ স্টাফেনচেজেলাস: --ফাইলের নাম (গুলি) এর আগে অবশ্যই গুরুত্বপূর্ণ: এটি ব্যতীত ড্যাশ দিয়ে শুরু হওয়া ফাইলের নামগুলি সেড দ্বারা বিকল্প হিসাবে বিবেচনা করা যেতে পারে। আমি আমার উত্তরে সেগুলি সম্পাদনা করেছি; অনুস্মারক জন্য আপনাকে ধন্যবাদ!
নামমাত্র প্রাণী 14

0

সম্প্রতি আমি এই ছোট্ট কমান্ড-লাইন সরঞ্জামটি পেয়েছি যা সালিসী UTF-8 এনকোডযুক্ত ফাইলগুলিতে বিওএম যুক্ত বা সরিয়ে দেয়: ইউটিএফ বিওএম ইউটিস ( গিথুবে নতুন লিঙ্ক )

সামান্য ব্যর্থতা, আপনি কেবল প্লেইন সি ++ উত্স কোডটি ডাউনলোড করতে পারেন। আপনাকে মেকফাইল তৈরি করতে হবে ( সিএমকে দিয়ে , উদাহরণস্বরূপ) এবং নিজের দ্বারা এটি সংকলন করতে হবে, বাইনারিগুলি এই পৃষ্ঠায় সরবরাহ করা হয়নি।

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