এই প্রশ্নের ব্যাখ্যার দুটি উপায় রয়েছে; আমি উভয় ক্ষেত্রেই সম্বোধন করব। আপনি লাইনগুলি প্রদর্শন করতে চাইতে পারেন:
- এতে চারটি সংখ্যার ক্রম রয়েছে যা নিজেই অঙ্কগুলির আর কোনও ক্রমের অংশ নয় or
- এতে একটি চার-অঙ্কের ক্রম রয়েছে তবে অঙ্কগুলির ক্রম আর থাকবে না (এমনকি আলাদাভাবেও নয়)।
উদাহরণস্বরূপ, (1) প্রদর্শিত হবে 1234a56789
, কিন্তু (2) তা করবে না।
আপনি যদি চারটি অঙ্কের ক্রমযুক্ত সমস্ত লাইন প্রদর্শন করতে চান যা নিজেই অঙ্কগুলির দীর্ঘতর ক্রমের অংশ নয় তবে একটি উপায় হ'ল:
grep -P '(?<!\d)\d{4}(?!\d)' file
এটি পার্ল নিয়মিত এক্সপ্রেশন ব্যবহার করে , যা উবুন্টু grep
( জিএনইউ গ্রেপ ) মাধ্যমে সমর্থন করে -P
। এটি এর মতো পাঠ্যের সাথে 12345
মেলে না 1234
বা 2345
এটির অংশ বা এটির সাথে মেলে না। কিন্তু এটা ম্যাচ হবে 1234
মধ্যে 1234a56789
।
পার্ল নিয়মিত প্রকাশে:
\d
কোনও অঙ্ক মানে (এটি বলার একটি ছোট উপায় [0-9]
বা [[:digit:]]
)।
x{4}
x
4 বার মেলে । ( {
}
সিনট্যাক্স পার্ল নিয়মিত এক্সপ্রেশনগুলির সাথে নির্দিষ্ট নয়; এটি বর্ধিত নিয়মিত এক্সপ্রেশনগুলির grep -E
মধ্যেও রয়েছে)) \d{4}
একইভাবে \d\d\d\d
।
(?<!\d)
শূন্য প্রস্থের নেতিবাচক চেহারা-পিছনে দৃ as়তা। এর অর্থ "আগে না থাকলে \d
"।
(?!\d)
শূন্য-প্রস্থের নেতিবাচক চেহারা-এগিয়ে উত্সাহ। এর অর্থ "অনুসরণ না করে \d
"।
(?<!\d)
এবং (?!\d)
চার অঙ্কের ক্রমের বাইরে পাঠ্যের সাথে মেলে না; পরিবর্তে, তারা (যখন একত্রে ব্যবহৃত হবে) চারটি অঙ্কের ক্রমকে নিজের থেকে মিলে যাওয়া আটকাবে যদি এটি অঙ্কগুলির দীর্ঘতর ক্রমের অংশ হয়।
ডানদিকের বা বামদিকের চার-অঙ্কের পরবর্তী অংশটি এখনও মিলে যাবে কারণ কেবল চেহারা-পিছনে বা কেবল চেহারা-সামনের দিকে ব্যবহার করা অপর্যাপ্ত।
চেহারা-পিছনে এবং তাত্ক্ষণিক বক্তব্যগুলি ব্যবহার করার একটি সুবিধা হ'ল আপনার প্যাটার্নটি কেবল চার-অঙ্কের অনুক্রমগুলি নিজের সাথে মেলে, না পার্শ্ববর্তী পাঠ্যের সাথে। রঙ হাইলাইটিং ( --color
বিকল্প সহ) ব্যবহার করার সময় এটি সহায়ক ।
ek@Io:~$ grep -P '(?<!\d)\d{4}(?!\d)' <<< 12345abc789d0123e4
12345abc789d0123e4
ডিফল্টরূপে উবুন্টু, প্রত্যেক ব্যবহারকারী রয়েছে alias grep='grep --color=auto'
তাদের মধ্যে ~.bashrc
ফাইল । সুতরাং আপনি যখন আপনি একটি সহজ দিয়ে শুরু কমান্ডটি প্রয়োগ স্বয়ংক্রিয়ভাবে হাইলাইট রঙ পেতে grep
(এই যখন alias লেখা সম্প্রসারিত হয় নি) এবং মান আউটপুট হয় একটি টার্মিনাল (এই কি জন্য চেক)। ম্যাচগুলি সাধারণত লাল রঙের ছায়ায় ( সিঁদুরের কাছাকাছি ) হাইলাইট করা হয় তবে আমি এটি ইতালিযুক্ত সাহসের সাথে দেখিয়েছি। এখানে একটি স্ক্রিনশট:--color=auto
এবং আপনি এমনকি grep
এটির সাথে কেবল মেলে পাঠ্য, এবং পুরো লাইনটিও মুদ্রণ করতে পারবেন -o
:
ek@Io:~$ grep -oP '(?<!\d)\d{4}(?!\d)' <<< 12345abc789d0123e4
0123
বিকল্প পন্থা, ছাড়া লুক-বিহাইন্ড এবং চেহারা-অ্যাহেড গবেষকেরা
তবে, যদি আপনি:
- একটি কমান্ড দরকার যা এমন সিস্টেমেও চলবে যেখানে
grep
সমর্থন করে না -P
বা অন্যথায় পার্ল নিয়মিত অভিব্যক্তি ব্যবহার করতে চায় না, এবং
- কি বিশেষভাবে চার ডিজিটের মেলা দরকার না - যা সাধারণত যদি হয় তাহলে আপনার লক্ষ্য প্রদর্শন ম্যাচ ধারণকারী লাইনে কেবল হয়, এবং
- একটি সমাধান যে ঠিক একটু মার্জিত হয় ঠিক আছে
... তারপরে আপনি এর পরিবর্তে বর্ধিত নিয়মিত প্রকাশের মাধ্যমে এটি অর্জন করতে পারেন :
grep -E '(^|[^0-9])[0-9]{4}($|[^0-9])' file
এটি চারটি সংখ্যার এবং অ-অঙ্কের অক্ষরের সাথে মেলে - বা লাইনটির শুরু বা শেষ - তাদের চারপাশে। বিশেষ করে:
[0-9]
যেকোন অঙ্কের সাথে (যেমন [[:digit:]]
, বা \d
পার্ল নিয়মিত এক্সপ্রেশনগুলিতে) মেলে এবং এর {4}
অর্থ "চারবার"। সুতরাং [0-9]{4}
একটি চার অঙ্কের ক্রম মেলে।
[^0-9]
সীমার মধ্যে না অক্ষরের সাথে মেলে 0
মাধ্যমে 9
। এটি [^[:digit:]]
(বা \D
পার্ল নিয়মিত প্রকাশে) এর সমতুল্য ।
^
, যখন এটি [
]
বন্ধনীগুলিতে উপস্থিত হয় না , একটি লাইনের শুরুর সাথে মেলে। একইভাবে, $
একটি লাইনের শেষের সাথে মেলে।
|
অর্থ বা এবং প্রথম বন্ধনী গোষ্ঠীগুলির জন্য (বীজগণিত হিসাবে)। সুতরাং (^|[^0-9])
লাইনটির শুরুতে বা একটি অ-অঙ্কের অক্ষরের সাথে ($|[^0-9])
মেলে , যখন রেখার শেষে বা একটি অ-অঙ্কের অক্ষরের সাথে মেলে।
সুতরাং ম্যাচগুলি কেবলমাত্র চার-অঙ্কের ক্রম ( [0-9]{4}
) যা একই সাথে থাকে:
- লাইনের শুরুতে বা একটি অ-অঙ্কের পূর্বে (
(^|[^0-9])
), এবং
- লাইনের শেষে বা একটি অ-অঙ্কের পরে (
($|[^0-9])
)।
অন্যদিকে, আপনি যদি চারটি অঙ্কের ক্রমযুক্ত সমস্ত লাইন প্রদর্শন করতে চান তবে চারটি সংখ্যার বেশি কোনও অনুক্রম (এমনকি একটি মাত্র চারটি সংখ্যার অন্য ক্রম থেকে পৃথক এমন একটি) না রাখেন তবে ধারণাগতভাবে আপনার লক্ষ্য হ'ল এক প্যাটার্নের সাথে মেলে এমন লাইনগুলি খুঁজে পাওয়া যা অন্য নয়।
অতএব, আপনি যদি এটি একক প্যাটার্ন দিয়ে কীভাবে করতে পারেন তা জানার পরেও আমি ম্যাট-এর দ্বিতীয় পরামর্শ মতো কিছু ব্যবহার করার পরামর্শ দিই grep
, দুটি প্যাটার্নের জন্য আলাদাভাবে আইএনএন তৈরি করা।
এটি করার সময় পার্ল নিয়মিত এক্সপ্রেশনগুলির কোনও উন্নত বৈশিষ্ট্য থেকে আপনি দৃ strongly়রূপে উপকার পাবেন না, তাই আপনি সেগুলি ব্যবহার না করা পছন্দ করতে পারেন। কিন্তু উপরে শৈলী সঙ্গে পালন, এখানে একটি সংক্ষেপিত এর অনুজ্জ্বল এর সমাধান ব্যবহার \d
স্থানে (এবং ধনুর্বন্ধনী) [0-9]
:
grep -P '\d{4}' file | grep -Pv '\d{5}'
যেহেতু এটি ব্যবহার করে [0-9]
, ম্যাট-এর উপায়টি আরও পোর্টেবল - এটি grep
এমন সিস্টেমে কাজ করবে যেখানে পার্ল নিয়মিত অভিব্যক্তি সমর্থন করে না। আপনি যদি এর পরিবর্তে [0-9]
(বা [[:digit:]]
) ব্যবহার করেন \d
তবে ব্যবহার চালিয়ে যান {
}
, আপনি কিছুটা আরও সংক্ষিপ্ততার সাথে ম্যাটটির পোর্টেবিলিটি পাবেন:
grep -E '[0-9]{4}' file | grep -Ev '[0-9]{5}'
বিকল্প উপায়, একক প্যাটার্ন সহ
আপনি যদি সত্যিই কোনও grep
আদেশ পছন্দ করেন
- একটি একক নিয়মিত অভিব্যক্তি ব্যবহার করে ( উপরে দুটি পাইপ
grep
দ্বারা পৃথক নয় )
- কমপক্ষে চার অঙ্কের এক সিকোয়েন্স যুক্ত লাইনগুলি প্রদর্শন করতে,
- তবে পাঁচটি (বা আরও) সংখ্যার কোনও অনুক্রম নেই,
- এবং আপনি পুরো অঙ্কটি মেলে মনে করবেন না, কেবল অঙ্কগুলি নয় (আপনি সম্ভবত এটি এতে আপত্তি করবেন না)
... তাহলে আপনি ব্যবহার করতে পারেন:
grep -Px '(\d{0,4}\D)*\d{4}(\D\d{0,4})*' file
-x
পতাকা তোলে grep
শুধুমাত্র লাইন প্রদর্শন যেখানে সমগ্র লাইন ম্যাচ (বদলে কোন লাইন ধারণকারী একটি ম্যাচ)।
আমি একটি পার্ল নিয়মিত এক্সপ্রেশন ব্যবহার করেছি কারণ আমি মনে করি এই ক্ষেত্রে সংক্ষিপ্তসার \d
এবং \D
উল্লেখযোগ্যভাবে স্পষ্টতা বাড়িয়েছে। তবে এমন সিস্টেমে যেখানে পোর্টেবল কিছু দরকার grep
নেই যেখানে সমর্থন করে না -P
, আপনি সেগুলি [0-9]
এবং [^0-9]
(অথবা সাথে [[:digit:]]
এবং [^[:digit]]
) এর সাথে প্রতিস্থাপন করতে পারেন :
grep -Ex '([0-9]{0,4}[^0-9])*[0-9]{4}([^0-9][0-9]{0,4})*' file
এই নিয়মিত প্রকাশের উপায়টি হ'ল:
মাঝখানে, \d{4}
বা [0-9]{4}
চার অঙ্কের এক ক্রম মেলে। আমাদের এর মধ্যে একটিরও বেশি থাকতে পারে তবে আমাদের কমপক্ষে একটি থাকা দরকার।
বাম দিকে, (\d{0,4}\D)*
বা ([0-9]{0,4}[^0-9])*
শূন্য বা আরও বেশি ( *
) এর চেয়ে বেশি সংখ্যার চারটি সংখ্যার নয় এবং তারপরে একটি অ-সংখ্যাটি অনুসরণ করবে। জিরো ডিজিট (অর্থাত্ কিছুই নয়) "চার অঙ্কের বেশি নয়" এর একটি সম্ভাবনা। এটি (ক) খালি স্ট্রিং বা (খ) কোনও স্ট্রিং অ-অঙ্কে শেষ হওয়া এবং চারটি সংখ্যার বেশি কোনও সিকোয়েন্স যুক্ত না করে matches
যেহেতু কেন্দ্রীয় \d{4}
(বা [0-9]{4}
) এর বাম দিকে অবিলম্বে পাঠ্যটি খালি হতে হবে বা একটি অ-অঙ্কের সাথে শেষ হতে হবে, এটি কেন্দ্রটিকে \d{4}
চারটি সংখ্যার সাথে মিলিয়ে বাধা দেয় যা কেবল তাদের বামে অন্য (পঞ্চম) সংখ্যার সাথে মেলে।
ডানদিকে, (\D\d{0,4})*
বা ([^0-9][0-9]{0,4})*
শূন্য বা আরও বেশি ( *
) এর সাথে মিল রাখে অ-অঙ্কের পরে চারটি অঙ্কের বেশি নয় (যা আগের মতো, চার, তিন, দুই, এক, এমনকি কোনওটিই হতে পারে না)। এটি (ক) খালি স্ট্রিং বা (খ) কোনও স্ট্রিং কোনও অ-অঙ্কের সাথে শুরু হওয়া এবং চারটি সংখ্যার বেশি কোনও সিকোয়েন্স যুক্ত না করে matches
যেহেতু কেন্দ্রীয় \d{4}
(বা [0-9]{4}
) এর ডানদিকে অবিলম্বে পাঠ্যটি খালি থাকতে হবে বা একটি অ-অঙ্কের সাথে শুরু করা উচিত, এটি কেন্দ্রটিকে \d{4}
চারটি সংখ্যার সাথে মিলে যাওয়া থেকে বিরত রাখে যার ঠিক ডানদিকে অন্য (পঞ্চম) অঙ্ক রয়েছে।
এটি নিশ্চিত করে যে চার-অঙ্কের ক্রমটি কোথাও উপস্থিত রয়েছে এবং পাঁচ বা ততোধিক সংখ্যার কোনও অনুক্রম কোথাও উপস্থিত নেই।
এইভাবে এটি করা খারাপ বা ভুল নয়। তবে সম্ভবত এই বিকল্পটি বিবেচনা করার সর্বাধিক গুরুত্বপূর্ণ কারণ এটি উপরের এবং ম্যাট-এর উত্তর অনুসারে পরিবর্তিত (বা অনুরূপ) ব্যবহারের সুবিধাটি স্পষ্ট করে ।grep -P '\d{4}' file | grep -Pv '\d{5}'
সেভাবে এটি পরিষ্কার হয়ে গেছে যে আপনার লক্ষ্যটি এমন লাইনগুলি নির্বাচন করা যা একটি জিনিস রাখে তবে অন্যটি নয়। প্লাস সিনট্যাক্স আরও সহজ (তাই এটি অনেক পাঠক / রক্ষণাবেক্ষণকারীদের দ্বারা আরও দ্রুত বোঝা যেতে পারে)।
1234a12345
প্রদর্শিত হওয়া উচিত, না?