পাঠ্য ফাইলগুলি - সেড, অন্যান্য ব্যাশ / শেল পদ্ধতি থেকে অজানা ইউনিকোড চরিত্রটি সরান


9

অজানা অক্ষরের সমস্ত উপস্থিতি একই নামযুক্ত ফাইলগুলিতে আমাকে অনুসন্ধান এবং প্রতিস্থাপন করতে হবে।

Vi এর সাথে এই জাতীয় ফাইলগুলি খোলার পরে, আমি এই চরিত্রটির জন্য <91> কোডটি পড়েছি। এগুলি ন্যানো দিয়ে খোলার পরে আমি হীরাতে একটি "প্রশ্ন চিহ্ন" পড়েছি (কালো ছড়াছড়ি) read

আমি এই জাতীয় অজানা চরিত্রটিকে একটি উদ্ধৃতি (') দিয়ে প্রতিস্থাপন করতে চাই। আমি ভাগ্য ছাড়াই অনেক উপায়ে চেষ্টা করছি।

আমি চেষ্টা করেছিলাম:

find ./ -name filename.txt -exec perl -i~ -pe "s/\x91/'/" {} \;



find ./ -name filename.txt -exec sed -i "s/\x91/'/g" {} \;

চরিত্রটি সম্পর্কে আরও তথ্য সম্পাদনা করুন:

Hexadecimal: 91 68 74 74
Decimal: 145 104 116 116
Octal: 221 150 164 164
Binary: 10010001 01101000 01110100 01110100

LC_ALL=C sed -n l < file

\221

আপনার আরও প্রয়োজন হলে জিজ্ঞাসা করুন!


কোন পথে sed -i "s/\x91/'/g"এটি fileকাজ করে না?
স্টাফেন চেজেলাস

উত্তর:


3

আপনার ব্যবহার করা উচিত hexdump -Cএবং এর চারপাশের বাইটগুলি খুঁজে পাওয়া উচিত । হল UTF-8, কি সাহসী viহিসাবে শো <91>(দশমিক 145, টেক্সট একটি ইউনিকোড বিন্দু অর্থহীন) দুই বাইট, 0xc2 এবং 0x91 হবে।

এটি বোঝানো হয়েছে যে আপনার প্রতিস্থাপনগুলি মোটেই কার্যকর হয়নি, তবে আপনি যা করেছেন কেবল 0x91 0x27 দিয়ে প্রতিস্থাপন করলে আপনি ইউটিএফ -8 বাতিল করে দেবেন (দুটি বাইট ক্রমের দ্বিতীয় বাইটটি সর্বদা উচ্চ বিট সেট থাকে, অর্থাৎ > = 0x80)। এটি আপনার বিশ্লেষণকে জটিল করে viতুলতে পারে যদিও এরপরে এটি প্রদর্শিত হবে ?'

বলেছিল, আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

my $data = "";
my $file = $ARGV[0];

while (<>) {
    s/\xc2\x91/'/g;
    $data .= $_;
}

open my $out, '>', $file || die "Could not write $file.";
print $out $data;
close $out;  

যদি $ARGV[0]বিদ্যমান যখন <>রেফারেন্সড হয়, পার্ল যুক্তি স্ট্যাকের বন্ধ এই পপ আপ এবং ইনপুট জন্য ব্যবহার করার একটা ঝোঁক filepath যেমন লাগে (আমি সংক্ষেপে স্ক্রিপ্ট সহজ খামচি এবং কাজ এক liners, BTW, চেয়ে)। এটি মেমরিতে জমে থাকে (যতক্ষণ না ফাইলগুলি বৃহত্তর না হওয়া পর্যন্ত সূক্ষ্ম), perl -iসেখানে সম্পাদনা-স্থান দৌড় পরিস্থিতি এড়াতে মূল ফাইলটির নতুন নামকরণ (দেখুন perldoc perlrun)।

সুতরাং আপনি এটি ব্যবহার করতে পারে:

  find . -name "*.txt" -exec whatever.pl {} +

এটি কাজ করে না, প্রশ্ন চিহ্নটি থেকে যায় ...
জেসমিন

hexdump -Cআসলে কি আছে তা দেখতে আপনি কি এটি পরীক্ষা করে দেখেছেন ?
সোনারলোকস

3

যদি এটি সত্যই U + 0091 (ইউটিএফ -8 এনকোডিং-এ 0xc2 0x91) হয় এবং বাইট 0x91 নয়, তবে:

PERLIO=:utf8 perl -pi -e "s/\N{U+0091}/'/g" file

এটি রূপান্তর করতে হবে '

জিএনইউ সহ sed:

sed -i "s/\xc2\x91/'/" file

সম্পাদনা:

তবে আপনার ক্ষেত্রে ফাইলটি ইউটিএফ -8 এ নেই। ইউটিএফ -8 অক্ষরগুলি একটি বাইট, কেবলমাত্র এসসিআইআই অক্ষরের জন্য (0 থেকে 0x7F মানের জন্য)। অন্যান্য অক্ষর দুটি বা আরও বেশি বাইট দ্বারা উপস্থাপিত হয় যার মান এর চেয়ে বেশি 0x7F। সুতরাং একটি 0x91বাইট, এর চারপাশে 0x7F এর চেয়ে বড় কোনও বাইট নেই কোনও utf-8 ফাইলে পাওয়া যাবে না।

সম্ভবত, আপনার ফাইলটি একক-বাইট অক্ষর সংকেতে রয়েছে, সম্ভবত কিছু মাইক্রোসফ্ট উইন্ডোজ -১২২২ এর মতো

উইন্ডোজ -১২২২ এ, 0x91 বাম একক উদ্ধৃতি অক্ষর। ইউনিকোড সমতুল্য ইউ + 2018 যা ইউটিএফ -8 এ লেখা আছে 0xe2 0x80 0x98

আপনি যদি নিজের ফাইলটিকে ইউটিএফ -8 এ রূপান্তর করতে চান তবে সম্ভবত এটির জন্য একটি উত্সর্গীকৃত সরঞ্জাম ব্যবহার করা। ভালো লেগেছে:

recode windows-1252..utf8 < file

বা:

iconv -f windows-1252 -t utf-8 < file

বা আপনি যদি এটির জন্য করতে চান তবে filename.txt:

find . -type f -name filename.txt -exec sh -Cc '
  for file do
    mv "$file" "$file~" &&
      iconv -f windows-1252 -t utf-8 < "$file~" > "$file"
  done' sh {} +

এটি কাজ করে না, প্রশ্ন চিহ্নটি থেকে যায় ...
জেসমিন

@jasmines তারপর এটি একটি নয় U+0091LC_ALL=C sed -n l < fileপ্রশ্নের আউটপুট যোগ করুন ।
স্টাফেন চেজেলাস

এটি 221
ডলার

আমি রূপান্তর করতে পারি না কারণ একটি ফাইল নয় ... আমার ব্যাচ এবং পুনরাবৃত্তভাবে অনুসন্ধান এবং প্রতিস্থাপন করা দরকার।
জেসমিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.