নিউলাইনগুলি উপেক্ষা করে কোনও ফাইলের পাঠ্য কীভাবে অনুসন্ধান করবেন?


11

আমি এমন পাঠ্য অনুসন্ধান করতে চাই যা কোনও ফাইলের বিভিন্ন লাইনে বিভক্ত হতে পারে। একটি গ্রেপ যা লাইন ব্রেকগুলিকে উপেক্ষা করবে এবং লাইনের মিলের স্প্যানটি ফিরিয়ে দেবে।

উদাহরণস্বরূপ আমি অনুসন্ধান করব is an example fileএবং এটি নিম্নলিখিত ফাইলটিতে পাওয়া যাবে বলে আশা করি:

এটি
একটি
উদাহরণ ফাইল।

শীর্ষস্থানীয় বা অনুসরণকারী জায়গাগুলির উপর নির্ভর না করে, সম্পূর্ণরূপে সাদা স্পেসকে উপেক্ষা করা সর্বোত্তম হতে পারে (আদর্শভাবে, সাদা স্থানের কোনও ক্রমকে একক স্থান হিসাবে বিবেচনা করা)।


একটি অ-আদর্শ সমাধান হ'ল tr '\n' ' ' | grep, এটি ম্যাচ এবং অ-ম্যাচের মধ্যে পার্থক্য রাখে, তবে ম্যাচটি দেখায় না বা বড় ফাইলগুলির সাথেও ভালভাবে ডিল করে না।


তাই (কোন নির্দিষ্ট উত্তর) উপর: stackoverflow.com/q/1858312/1449460
Nikana Reklawyks

পার্শ্ব দ্রষ্টব্য হিসাবে, isearch-forward
ইম্যাকস

সুতরাং তেজ এর আছে: /This\_sis। বিস্তারিত জানতে দেখুন: :help \_s
lcd047

আপনার সন্ধানের লাইনের শেষে এই লাইনটি যুক্ত করুন: ট্র-এন "\ n" এটি সমস্ত নতুন লাইন সরিয়ে দেবে। এই সাহায্য আশা করি!
ড্যান হায়েল

উত্তর:


12

জিএনইউ grepএটি করতে পারে

grep -z 'is\san\sexample\sfile.' file

মন্তব্যে উত্থিত কিছু পয়েন্টগুলি পূরণ করতে স্ক্রিপ্টে কিছু পরিবর্তন রয়েছে:

 grep -oz '^[^\n]*\bis\s*an\s*example\s*file\.[^\n]*' file

বিশাল ফাইল সম্পর্কিত আমি মেমরির সীমাবদ্ধতার কোনও কল্পনাও করি না তবে সমস্যার ক্ষেত্রে আপনি ব্যবহারে নির্দ্বিধায় sed

sed '/\bis\b/{
          :1
          N
          /file\.\|\(\n.*\)\{3\}/!b1
         }
     /\<is\s*an\s*example\s*file\./p
     D' file

যা 4-লাইনের বেশি নয় (কারণ 4 শব্দ প্যাটার্নে) স্মৃতিতে ( \(\n.*\)\{3\})।


5
যেহেতু আমি নিশ্চিত যে আপনি জানেন, -zবিকল্পটি grepনিউলাইনগুলিকে সাধারণ পাঠ্য অক্ষরের হিসাবে বিবেচনা করতে এবং পৃথক রেকর্ডে নুল বাইটগুলি সন্ধান করতে বলে। কোনও টেক্সট ফাইলে কোনও নুল বাইট নেই (যেমন, সাধারণ কেস) grep -zপুরো ফাইলটিকে এক লাইন হিসাবে বিবেচনা করবে। সুতরাং (1) এটি বড় ফাইলগুলি কতটা হ্যান্ডেল করতে পারে তা নিয়ে প্রশ্ন উত্থাপন করে এবং (২) এটি যদি কোনও মিল খুঁজে পায় তবে এটি পুরো ফাইলটি লিখে ফেলবে, ম্যাচের অবস্থানটি সম্পর্কে কোনও ধারণা দেয় না। এছাড়াও (3) ওপি বলেছিল, "আদর্শভাবে, সাদা স্থানের যে কোনও ক্রমকে একক স্থান হিসাবে বিবেচনা করা," যাতে আপনার ব্যবহার \s+এবং যোগ করা উচিত -E
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

1
@ জি-ম্যান মন্তব্য করার জন্য আপনাকে ধন্যবাদ। সম্পাদিত উত্তর দেখুন।
কস্টাস

1
(0) আহ -o,; আমি সে সম্পর্কে ভুলে যেতে থাকি। এটি ব্যবহারের চতুর উপায়। (1) আপনার নতুন grepউত্তর শুরু হয় ^[\n]*; যে জন্য একটি টাইপো এর [^\n]*। (২) আমি \s+ইচ্ছাকৃতভাবে বলেছি ।  be\s*littleমিলবে belittle, care\s*lessমিলবে careless। তবে আমার ধারণা এটি একটি ছোটখাটো সমস্যা। এবং, আপনি ব্যবহার করতে না চান তাহলে -E, আপনি এর "দরিদ্র মানুষের সংস্করণ" ব্যবহার করতে পারেন \s+, যথা, \s\s*। (3) সুন্দর sedকমান্ড। ফাঁকা লাইন থাকলে এটি ব্যর্থ হতে পারে (সুতরাং চার-শব্দের বাক্যাংশটি চারটি লাইনের বেশি ছড়িয়ে যেতে পারে); আমি যোগ করে এটি ঠিক করতে সক্ষম হয়েছি s/\n\s*\n/\n/
জি-ম্যান বলছেন 'মনিকাকে পুনরায় ইনস্টল করুন'

@ জি-ম্যান আপনাকে ধন্যবাদ আপনার মন্তব্যগুলি খুব দরকারী। আমি কম বেশি পোর্টেবল কোড পোস্ট করার চেষ্টা করেছি কারণ বিখ্যাত সদস্যরা আমাকে সর্বদা এটি করার জন্য চাপ দিন। যাই হোক এমনকি ছাড়া -Eআপনি ইস্পাত ব্যবহার করতে পারবেন +\s\+ফর্ম। প্যাটার্নের ভিতরে খালি লাইনগুলি একটি সংঘবদ্ধ বলে মনে হচ্ছে।
কোস্টাস 20'15

আমি পৃষ্ঠা অনুযায়ী বিন্যস্ত পাঠ্য দস্তাবেজ চিন্তা ছিল, মত RFCs - ISTR মানুষের পৃষ্ঠাগুলি যে কিছু সিস্টেমে মত চেহারা (অথবা করেনি ) - কিন্তু, আরও চিন্তার উপর, এটা যে সবচেয়ে যেমন নথি পৃষ্ঠা শিরোলেখ (গুলি) এবং / অথবা পাদচরণ আছে আমার কাছে দেখা দেয় (গুলি) যা grepতাদের কাছে বাক্যাংশের জন্য আশা করার আগে তা ছিনিয়ে নেওয়া দরকার ।
জি-ম্যান

7

এটা চেষ্টা কর:

pcregrep -M '\bThis\s+is\b' <<EOT
This
is
an example
file.
EOT

আমি \s"এটি খুব দীর্ঘ প্যাটার্নটি" অনুসন্ধান করলে 5 বার টাইপ করতে হবে ?
নিকানা রেকলাভিক্স

1
হ্যাঁ: পয়েন্টটি \sস্পেসের সাথে মেলে এবং নিউলাইনটি একটি "স্পেস"।
lcd047

আমি বোঝাতে চাইছি, ফাইলটি কী This\nis a very\nlong patternএবং আমি জানি না যে লাইন বিরতি কোথায় ঘটতে পারে। আমাকে অনুসন্ধান করতে হবে This\sis\sa\svery\slong\spattern, তাই না? (যা প্যাটার্নের দৈর্ঘ্য বাড়ার সাথে বা অন্য কোথাও থেকে আটকানো ক্লান্তিকর হয়ে ওঠে)
নিকানা রেকলাভিক্স

2
তারপরে আপনি এটি এর মতো করুন : pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file.
lcd047
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.