আমি grep
ইউনিক্স প্ল্যাটফর্মে ফাইলগুলিতে কীভাবে ট্যাব করব (\ t)?
আমি grep
ইউনিক্স প্ল্যাটফর্মে ফাইলগুলিতে কীভাবে ট্যাব করব (\ t)?
উত্তর:
যদি জিএনইউ গ্রেপ ব্যবহার করে থাকেন তবে আপনি পার্ল-স্টাইলের রেজিপ্সপ ব্যবহার করতে পারেন:
grep -P '\t' *
-P
বিকল্প সম্পর্কে কিছু জানেন না ।
কৌশলটি হ'ল একক উদ্ধৃতিগুলির আগে চিহ্নটি ব্যবহার করা । এটি কাটা এবং অন্যান্য সরঞ্জামগুলির জন্যও কাজ করে।
grep $'\t' sample.txt
zsh
যেমন কাজ করে ততদূর আমি বলতে পারি। আপনি কি মন্তব্য করতে পারেন যে চিহ্নটির শব্দার্থক $
শব্দটি কী?
$'\t'' '
। একটি বাস্তব উদাহরণ শো এটা SH (না শুধুমাত্র ব্যাশ, যা ডিফল্টভাবে Android এর উপর ইনস্টল করা নয়) সঙ্গে আরো কাজ করে busybox grep -oE '^nodev'$'\t''fuse$' /proc/filesystems
।
আমি গ্রিপ দিয়ে '\ t' মেটাচার্যাক্টর কাজটি কখনও পরিচালনা করতে পারি নি। তবে আমি দুটি বিকল্প সমাধান পেয়েছি:
<Ctrl-V> <TAB>
(আঘাত জন্য Ctrl-ভি তারপরে TAB টাইপ)foo | awk '/\t/'
| awk '/\t/'
সমাধান সব শাঁস, প্লাটফর্ম এবং সিস্টেম জন্য কাজ করবে।
awk
এখানে ভাল কাজ করে তবে খুব বড় ফাইলগুলির সাথে আমার মেশিনে কিছু পরীক্ষায় এটি ব্যবহারের চেয়ে 30% ধীর grep -P
। এটি ব্যবহারের ক্ষেত্রে ভিত্তিতে তুচ্ছ এবং অপ্রাসঙ্গিক হতে পারে, এবং awk
সহজভাবে পঠনযোগ্যতা এবং বহনযোগ্যতার জন্য ভাল হতে পারে।
জিজ্ঞাসা উবুন্টু এই উত্তর থেকে :
পার্ল দ্বারা নির্ধারিত নিয়মিত এক্সপ্রেশনগুলি ব্যবহার করতে গ্রেপকে বলুন (পার্লটির
\t
ট্যাব রয়েছে):grep -P "\t" <file name>
আক্ষরিক ট্যাব অক্ষর ব্যবহার করুন:
grep "^V<tab>" <filename>
আপনার
printf
জন্য একটি ট্যাব অক্ষর মুদ্রণ ব্যবহার করুন :grep "$(printf '\t')" <filename>
একটি উপায় (এটি বাশের সাথে রয়েছে)
grep -P '\t'
-P
পার্ল নিয়মিত এক্সপ্রেশনগুলি চালু করে যাতে work t কাজ করবে।
যেমন ব্যবহারকারী অনাইন্ড বলেছেন, এটি জিএনইউ গ্রেপের সাথে সুনির্দিষ্ট হতে পারে। শেল, সম্পাদক বা টার্মিনাল যদি এটির অনুমতি দেয় তবে বিকল্পটি সেখানে আক্ষরিকভাবে একটি ট্যাব sertোকানো হয়।
আক্ষরিক অর্থে ট্যাবটি সন্নিবেশ করার আরেকটি উপায় হ'ল $'\t'
বাশের মধ্যে স্বল্প-জানা কোটেশনটি ব্যবহার করা :
grep $'foo\tbar' # matches eg. 'foo<tab>bar'
(মনে রাখবেন যে আপনি যদি স্থির স্ট্রিংয়ের সাথে মিলে থাকেন তবে আপনি এটি '-F' মোডের সাথে ব্যবহার করতে পারেন))
কখনও কখনও ভেরিয়েবলগুলি ব্যবহার করে স্বরলিপিটি কিছুটা বেশি পঠনযোগ্য এবং পরিচালিত হয়:
tab=$'\t' # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id" # matches eg. `bob2<tab>323`
এটি ঠিক আপনি যা খুঁজছেন তা নয়, তবে এটি আপনার ক্ষেত্রে কার্যকর হতে পারে
grep '[[:blank:]]'
সমতুল্য
grep -P '[ \t]'
সুতরাং এটি স্পেস এবং ট্যাবটি খুঁজে পাবে।
দ্রষ্টব্য, এটি আমার বিজ্ঞাপন করা হয় নি man grep
, তবে এখনও কাজ করে
gre man grep | গ্রেপ ফাঁকা | wc- 0 0 0
-P
যুক্তি যুক্ত করা হয়েছিল।
এটি সম্বোধনের মূলত দুটি উপায় রয়েছে:
( প্রস্তাবিত ) গ্রেপ (1) দ্বারা সমর্থিত নিয়মিত এক্সপ্রেশন সিনট্যাক্স ব্যবহার করুন। আধুনিক গ্রেপ (1) দুটি পসিক্স 1003.2 রিজেক্স সিনট্যাক্সকে সমর্থন করে: বেসিক (অপ্রচলিত) আরইএস এবং আধুনিক আরইএস। সিনট্যাক্সটি পুনরায় ফর্ম্যাট (7) এবং রেজেেক্স (7) ম্যান পৃষ্ঠাগুলির বিবরণে বর্ণিত হয়েছে যা যথাক্রমে বিএসডি এবং লিনাক্স সিস্টেমের অংশ। জিএনইউ গ্রেপ (1) পিসি (3) লাইব্রেরি দ্বারা সরবরাহিত পার্ল-সামঞ্জস্যপূর্ণ আরইএসকে সমর্থন করে।
রেজেক্স ভাষায় ট্যাব প্রতীকটি সাধারণত \t
অণু দ্বারা এনকোড থাকে। পরমাণুটি BSD বর্ধিত নিয়মিত এক্সপ্রেশন ( egrep
, grep -E
BSD সামঞ্জস্যপূর্ণ সিস্টেমে), পাশাপাশি পার্ল-সামঞ্জস্যপূর্ণ আরইএস ( pcregrep
, জিএনইউ grep -P
) দ্বারা সমর্থিত ।
উভয় প্রাথমিক নিয়মিত এক্সপ্রেশন এবং লিনাক্স বর্ধিত আরইগুলির স্পষ্টতই এর জন্য কোনও সমর্থন নেই \t
। কোন রেগেক্স ভাষাটি সমর্থন করে তা জানার জন্য দয়া করে ইউনিক্স ইউটিলিটি ম্যান পৃষ্ঠার সাথে পরামর্শ করুন (সুতরাং সেড (1), আর্ক (1), এবং প্যাকগ্রিপ (1) নিয়মিত এক্সপ্রেশনগুলির মধ্যে পার্থক্য)।
অতএব, লিনাক্সে:
$ grep -P '\t' FILE ...
বিএসডি একই পদ্ধতিতে:
$ egrep '\t' FILE ...
$ grep -E '\t' FILE ...
প্যাটার্নে ট্যাব চরিত্রটি পাস করুন। আপনি কোনও স্ক্রিপ্ট ফাইল সম্পাদনা করার সময় এটি সোজা হয়:
# no tabs for Python please!
grep -q ' ' *.py && exit 1
তবে, ইন্টারেক্টিভ শেলটিতে কাজ করার সময় আপনাকে লাইনে সঠিক চিহ্নটি টাইপ করতে শেল এবং টার্মিনাল সক্ষমতার উপর নির্ভর করতে হবে। বেশিরভাগ টার্মিনালগুলিতে এটি Ctrl
+ V
কী সংমিশ্রণের মাধ্যমে করা যায় যা পরবর্তী ইনপুট চরিত্রটিকে আক্ষরিকভাবে আচরণ করতে নির্দেশ দেয় (এটি V
"ভার্ব্যাটিম" এর জন্য):
$ grep '<Ctrl>+<V><TAB>' FILE ...
কিছু শেল কমান্ড টাইপসেটিংয়ের জন্য উন্নত সহায়তা সরবরাহ করতে পারে। যেমন, বাশ (1) ফর্মের শব্দগুলিকে $'string'
বিশেষভাবে চিকিত্সা করা হয়:
bash$ grep $'\t' FILE ...
তবে দয়া করে নোট করুন, কমান্ড লাইনে চমৎকার থাকার সময় এটি স্ক্রিপ্টটিকে অন্য প্ল্যাটফর্মে স্থানান্তরিত করা হলে সামঞ্জস্যতার সমস্যা তৈরি করতে পারে। এছাড়াও, বিশেষ ব্যবহারের সময় উক্তিগুলি সম্পর্কে সতর্কতা অবলম্বন করুন, দয়া করে বিশদের জন্য বাশ (1) এর সাথে পরামর্শ করুন।
বোর্ন শেলের জন্য (এবং কেবলমাত্র নয়) একই আচরণটি প্রিন্টফ (1) দ্বারা যথাযথ রেজেক্স নির্মাণের জন্য বিকল্প কমান্ড বিকল্প ব্যবহার করে অনুকরণ করা যেতে পারে:
$ grep "`printf '\t'`" FILE ...
গাওক ব্যবহার করুন, ফিল্ড ডিলিমিটারটি ট্যাবে (\ t) সেট করুন এবং ক্ষেত্রের সংখ্যা পরীক্ষা করুন। যদি 1 এর বেশি হয় তবে ট্যাবগুলি আছে / আছে
awk -F"\t" 'NF>1' file
awk /\t/
বিকল্পের প্রশ্নের জন্য যথেষ্ট।
'শেড হিসাবে গ্রেপ হিসাবে' ব্যবহার করা একটি ভাল পছন্দ (এই ক্লাসিক্যাল সেড টিউটোরিয়ালে বর্ণিত )।
sed -n 's/pattern/&/p' file
উদাহরণ (বাশ, শ, খ, সিএস, .. এ কাজ করে):
[~]$ cat testfile
12 3
1 4 abc
xa c
a c\2
1 23
[~]$ sed -n 's/\t/&/p' testfile
xa c
a c\2
[~]$ sed -n 's/\ta\t/&/p' testfile
a c\2
+1 উপায়, যা ksh, ড্যাশ ইত্যাদিতে কাজ করে: টিএবি sertোকাতে প্রিন্টফ ব্যবহার করুন:
grep "$(printf 'BEGIN\tEND')" testfile.txt
grep "$(printf '\t')" testfile.txt
'সেড-এ-গ্রেপ' পদ্ধতিটি ব্যবহার করে, তবে ব্যক্তিগত পছন্দের দৃশ্যমান চরিত্রের সাথে ট্যাবগুলি প্রতিস্থাপন করা আমার প্রিয় পদ্ধতি, কারণ এটি স্পষ্টভাবে দেখায় যে কোন ফাইলগুলিতে অনুরোধ করা তথ্য রয়েছে এবং এটি লাইনগুলির মধ্যে কোথায় রাখা হয়েছে:
sed -n 's/\t/\*\*\*\*/g' file_name
আপনি যদি লাইন / ফাইল তথ্য, বা অন্যান্য গ্রেপ বিকল্পগুলি ব্যবহার করতে চান তবে ট্যাব অক্ষরের দৃশ্যমান প্রতিস্থাপনটি দেখতে চান তবে আপনি এটি অর্জন করতে পারেন
grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'
উদাহরণ হিসাবে:
$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar
সম্পাদনা: স্পষ্টতই উপরেরগুলি ট্যাবগুলি সনাক্ত করতে ফাইলের সামগ্রীগুলি দেখার জন্য দরকারী --- যদি উদ্দেশ্যটি বৃহত স্ক্রিপ্টিং সেশনের অংশ হিসাবে ট্যাবগুলি পরিচালনা করতে হয় তবে এটি কোনও কার্যকর উদ্দেশ্য কার্যকর করে না।
আপনি ব্যবহার করতে পারেন grep "$(echo -e '\t')"
শুধুমাত্র প্রয়োজন echo
ব্যাকস্ল্যাশ পলায়নের ব্যাখ্যা করতে সক্ষম হওয়া প্রয়োজন ।
এই বিকল্প বাইনারি সনাক্তকরণ পদ্ধতিগুলি সম্পূর্ণ কার্যকরী। এবং, আমি সত্যিই কারও এর মতো অ্যাঞ্জ ব্যবহার করা পছন্দ করি, কারণ আমি একক বাইনারি চরগুলির সাথে বাক্যবিন্যাসের ব্যবহারটি খুব মনে করতে পারি নি। তবে একটি পসিক্স পোর্টেবল ফ্যাশনে (যেমন টিএবি = echo "@" | tr "\100" "\011"
) একটি শেল ভেরিয়েবলের একটি মান নির্ধারণ করাও সম্ভব হবে এবং তারপরে পসিক্স পোর্টেবল ফ্যাশনে এটিকে সেখান থেকে সর্বত্র নিয়োগ করা উচিত; পাশাপাশি (যেমন গ্রেপ "$ ট্যাব" ফাইলের নাম)। যদিও এই সমাধানটি টিএবির সাথে ভালভাবে কাজ করে, এটি অন্যান্য বাইনারি চরগুলিও ভালভাবে কাজ করবে, যখন অন্য কোনও পছন্দসই বাইনারি মান অ্যাসাইনমেন্টে ব্যবহৃত হবে (TAB অক্ষরের জন্য 'টিআর'র পরিবর্তে মানটির পরিবর্তে)।
অন্যান্য উত্তরে প্রদত্ত $ '\ t' স্বরলিপিটি শেল-নির্দিষ্ট - এটি ব্যাশ এবং zsh তে কাজ করে বলে মনে হচ্ছে তবে সর্বজনীন নয়।
দ্রষ্টব্য: fish
নীচেটি শেলের জন্য এবং ব্যাশে কাজ করে না :
ইন fish
শেল, এক একটি unquoted ব্যবহার করতে পারেন \t
উদাহরণস্বরূপ:
grep \t foo.txt
অথবা কেউ হেক্স বা ইউনিকোড স্বরলিপি ব্যবহার করতে পারে যেমন:
grep \X09 foo.txt
grep \U0009 foo.txt
(এই স্বরলিপিগুলি আরও রহস্যময় চরিত্রগুলির জন্য দরকারী)
যেহেতু এই মানগুলি অবশ্যই অবতীর্ণ হওয়া উচিত, তাই একের সাথে উদ্ধৃত এবং অব্যক্ত মানগুলি একত্রিত করা যায়:
grep "foo"\t"bar"
আপনি টাইপ করতে পারেন
গ্রেপ f t ফু
গ্রেপ '\ t' ফু
ফাইল ফুতে ট্যাব অক্ষরের সন্ধান করতে। আপনি সম্ভবত অন্যান্য পালানোর কোডগুলিও করতে পারেন, যদিও আমি কেবল tested n পরীক্ষা করেছি। যদিও এটি বরং সময়সাপেক্ষ এবং আপনি কেন চান তা অস্পষ্ট, zsh এ আপনি ট্যাব অক্ষরটি টাইপ করতে পারেন, আবার শুরুতে, গ্রেপ করতে পারেন এবং উদ্ধৃতি সহ ট্যাবটি সংযুক্ত করে রাখতে পারেন।
অনেকবার ফাঁকা জায়গা অনুসন্ধান করুন [[: স্পেস:]] *
গ্রেপ [[: স্পেস:]] * '।' '।'
এর মতো কিছু পাবেন:
'ট্যাব' ..
এগুলি একক উদ্ধৃতি ('), এবং দ্বিগুণ নয় (")
gre
grep "<Ctrl+V><TAB>"
: এটি কাজ করে (টাইপ যদি প্রথমবারgrep "
তারপর Ctrl + ভী কী কম্বো, তারপর TAB কী টিপুন, তারপর টাইপ করুন"
এবং হিট লিখুন, ভিওলা!)