একটি কার্যপ্রবাহ (ফাইল) থেকে সমস্ত অ-এসকি অক্ষর মুছে ফেলা হচ্ছে


13

আমি কীভাবে একটি ফাইল থেকে সমস্ত অ-অসি অক্ষর মুছে ফেলব? এটি সম্পাদন করার জন্য একটি নির্দিষ্ট আদেশ থাকবে?

grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...

আমি বিশ্বাস করি যে এটি কর্মপ্রবাহের মধ্যেই অক্ষরগুলি খুঁজে পাবে, তবে আমি কীভাবে প্রশ্নে থাকা চরিত্রগুলির সমস্ত উদাহরণগুলি সরিয়ে ফেলব?



2
সম্পর্কিত: আপনি যদি নিয়ন্ত্রণ চরগুলির সাথে সমস্যাগুলি এড়াতে চান (চুপচাপ এগুলি থেকে মুক্তি পাওয়ার পরিবর্তে), আপনি কেবল cat -vতাদের জন্য ASCII পুনঃসংশোধনে এটি প্রদর্শন করতে ব্যবহার করতে পারেন । (। যেমন ^Gজন্য \007)
Matija Nalis

1
আপনি যখন "অ-অ্যাসিআই চরিত্রগুলি" বলছেন আপনি কি উচ্চারণযুক্ত অক্ষরগুলিও অন্তর্ভুক্ত করবেন?
ক্যাপ্টেন ম্যান

1
: উপস্থাপনা সম্পর্কে @MatijaNalis আরও তথ্য en.wikipedia.org/wiki/Caret_notation
wjandrea

1
ব্যবহারের ক্ষেত্রে কী? খুব প্রায়শই নির্দিষ্ট সরঞ্জাম বা বিভিন্ন পদ্ধতি রয়েছে যা কেবল বিশেষ চরিত্রগুলির একগুচ্ছ অপসারণের চেয়ে আরও ভাল কাজ করে। দয়া করে নোট করুন যে ASCII- এ বেশ কয়েকটি "বিশেষ" অক্ষর যেমন উল্লম্ব ট্যাব, বেল এবং NUL- টি অন্তর্ভুক্ত রয়েছে - আপনি কি নিশ্চিত যে আপনি মুদ্রণযোগ্য অক্ষরগুলি বোঝাতে চাইছেন না ?
l0b0

উত্তর:


26

ASCII অক্ষরগুলি 0 থেকে 177 (অক্টাল) সমেত অন্তর্ভুক্ত অক্ষর

কোনও ফাইলের মধ্যে এই ব্যাপ্তির অক্ষরগুলি মুছতে, ব্যবহার করুন

LC_ALL=C tr -dc '\0-\177' <file >newfile

trকমান্ড একটি ইউটিলিটি যে একক অক্ষর উপর কাজ করে , হয়, অন্যান্য একক অক্ষর (ট্রান্সলিটারেশন) সঙ্গে তাদের বদলে সেগুলি মুছে ফেলা হলে, অথবা একটি একক অক্ষর একই চরিত্রের রান সংকুচিত।

উপরের কমান্ডটি পড়তে fileএবং এতে পরিবর্তিত সামগ্রী লিখিত হবে newfile-dবিকল্প trতোলে ইউটিলিটি ডিলিট অক্ষর (তাদের transliterating পরিবর্তে), এবং -cএটি দেওয়া অন্তর (ভিতরে পরিবর্তে) বাহিরে অক্ষর বিবেচনা করে তোলে।

LC_ALL=Cপ্রতিটি বাইট মানটি একটি বৈধ অক্ষর তৈরি করে তা নিশ্চিত করে। এটি ছাড়া, কিছু trপ্রয়োগগুলি যদি বাইটগুলির ক্রমগুলি খুঁজে পায় যা লোকেলের অক্ষর এনকোডিংয়ে বৈধ অক্ষর তৈরি করে না।


পরিবর্তিত ফাইলের সাথে আসল ফাইলটি প্রতিস্থাপন করতে ব্যবহার করুন

LC_ALL=C tr -dc '\0-\177' <file >newfile &&
mv newfile file

এটি trসফলতার সাথে সমাপ্ত হওয়ার পরে নতুন ফাইলটির নাম পুরানো ফাইলটির নামে রাখে । যদি trসফলভাবে সম্পন্ন না হয়, হয় কারণ এটি মূল ফাইলটি পড়তে পারে না বা নতুন ফাইলে লিখতে পারে না, মূল ফাইলটি অপরিবর্তিত থাকবে left

বিকল্পভাবে, মূল ফাইলের মেটা ডেটা (অনুমতি ইত্যাদি) যথাসম্ভব সংরক্ষণ করার জন্য, ব্যবহার করুন

cp file tmpfile &&
LC_ALL=C tr -dc '\0-\177' <tmpfile >file &&
rm tmpfile


9

আপনার যা দরকার তা হ'ল একটি রেজেক্স: [\x00-\x7F]যা আপনি বেশ কয়েকটি ইউটিলিটিতে প্রয়োগ করতে পারেন:

<file LC_ALL=C   sed   's/[^\o0-\o177]//g'      # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^\0-\177]/,"");print}'
<file            perl  -pe 's/[^[:ascii:]]//g;'
<file LC_ALL=C   tr    -dc '\0-\177'

বুঝতে হবে যে সেড, অজস্র, এবং পার্ল ইউনিক্সে সংজ্ঞায়িত হিসাবে "পাঠ্য ফাইলগুলি" আশা করে। এক্ষেত্রে সবাই ভাল কাজ করে। তবে বিশেষত, awk একটি চলন্ত নতুন লাইন যুক্ত করে (এটি উত্স ফাইলে বিদ্যমান ছিল বা না) (প্রিন্টফ ব্যবহার করে ইনপুটটিতে সমস্ত নতুনলাইন সরিয়ে দেয়)। টিআরটি কোনও ফাইল টাইপের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে। তবে NUL ( \0) কোনও পসিক্স পাঠ্য ফাইলে বৈধ অক্ষর নয় এবং এড়ানো উচিত:

লাইনে NUL টি অক্ষর নেই ...

প্রকৃতপক্ষে, অনেকগুলি নিয়ন্ত্রণের অক্ষরগুলি কিছু নির্দিষ্ট অবস্থার অধীনে অন্যান্য সমস্যা তৈরি করে।
সুতরাং, সম্ভবত আপনার প্রয়োজন[\x07-\x0d\x20-\x7e]

<file LC_ALL=C   sed   's/[^\o007-\o015\o040-\o176]//g'            # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^\0-\15\40-\176]/,"");print}'
<file            perl  -pe 's/[^\x{7}-\x{d}\x{20}-\x{7e}]//g;'
<file LC_ALL=C   tr    -dc '\7-\15\40-\176'

পরিধি 7-13 (দশমিক হিসাবে) \a\b\t\n\v\f\r(ক্রম)।
একটি অনুরূপ (সম্ভবত আরও বহনযোগ্য) পরিসরটি [^[:space:][:print:]] (similar because it doesn't include\ a \ b` --বেল এবং ব্যাকস্পেস-- হিসাবে লেখা যেতে পারে ।

<file LC_ALL=C   sed   's/[^[:space:][:print:]]//g'  # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^[:space:][:print:]]/,"");print}'
<file            perl   -pe 's/[^[:space:][:print:]]//g;'
<file LC_ALL=C   tr     -dc '[:space:][:print:]'

সম্পর্কিত: যে
কোনও ASCII অক্ষর
পার্ল সমাধান
পিক্সিক্স টেক্সট ফাইলকে রিজেক্স করুন


নোট করুন যে ইনপুটটি trকোনও পাঠ্য ফাইল নয়, কোনও ধরণের ফাইল হতে পারে। awkঅন্যদিকে, একটি পাঠ্য ফাইল নেয়।
কুসালানন্দ

"কেবলমাত্র এসসিআই অক্ষর" কোনও ফাইলকে "পাঠ্য ফাইল" (হ্যাঁ, হ্যাঁ: সাধারণ লোকের ভাষায়) বলা ছাড়া আর কিছুই খুঁজে পাওয়া আমার পক্ষে বেশ কঠিন। @ কুসালানন্দ (যাইহোক অ্যাডাব্লিক সম্পর্কে নোট দিন)।
নোটঅনিক্সনাজি

নোট এটি gensub()গোক এক্সটেনশন। আপনি চাইবেন gsub(...); printএবং হেক্স সিকোয়েন্সগুলির পরিবর্তে (এবং এলসি_এলএল = সি) পোর্টেবল হওয়ার জন্য অষ্টালটি ব্যবহার করুন।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস জিএনইউ সিডের সীমাবদ্ধতা কী যা সিনট্যাক্স জিএনইউকে নির্দিষ্ট করে তোলে (আমি পজিক্সলাই_সিআরসিটি সমস্যাটি বুঝতে পারি)।
অ্যান ইউনিক্স নাজি

[^\o0]পোকসিক্সে ব্যাকস্ল্যাশ, ও ও 0 ব্যতীত অন্য অক্ষরের সাথে মিল আছে sed(সমস্ত বাস্তবায়নে তবে জিএনইউ সেড)। এটি GNU এর সীমাবদ্ধতা নয় sedবরং একটি অ-সঙ্গতিপূর্ণ এক্সটেনশন, যার কারণে POSIXLY_CORRECT পরিবেশে থাকলে এটি অক্ষম করা হয়)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.