রেজেক্স এবং সেড / পার্ল: শব্দের সাথে মিল করুন যা এর আগে অন্য কোনও শব্দের আগে নয়


11

আমি এমন শব্দটির সমস্ত উপস্থিতি ব্যবহার করতে sedবা perlপ্রতিস্থাপন করতে চাই যার সামনে একটি নির্দিষ্ট শব্দ নেই।

উদাহরণস্বরূপ, আমার কাছে একটি টেক্সট ফাইল রয়েছে যা একটি চলচ্চিত্রের প্লট ধারণ করে এবং আমি একটি চরিত্রের শেষ নামটির সমস্ত উপস্থিতি তাদের প্রথম নামের সাথে প্রতিস্থাপন করতে চাই, তবে কেবল যদি তাদের প্রথম নামটি তাদের শেষ নামের সাথে সাথে না আসে।

নমুনা পাঠ্যটি এর মতো দেখতে পাওয়া যাবে:

John Smith and Jane Johnson talk about Smith's car.

আমি এটি দেখতে এটি দেখতে চাই:

John Smith and Jane Johnson talk about John's car.

আমি যদি কেবল sed 's/Smith/John/' fileএটিই করি তবে আমার তা হবে:

John John and Jane Johnson talk about John's car.

সর্বশেষ নামের আগে যে নামটি আসে তা সর্বদা একই থাকবে। আমার সাথে ডিল করতে হবে না John Smithএবং Frank Smith। আমি শুধু একটি উপায় মেলা দরকার Smithযে নেই Johnএটা পূর্ববর্তী।


আপনি কোন সেডের কথা বলছেন?
Ignacio Vazquez-Abram

জিএনইউ লিনাক্সে 4.2.1 এ
সিড করেছে

উত্তর:


8

নিয়মিত প্রকাশগুলি নজরদারি করতে সক্ষম এমন কোনও ভাষার সাথে সহজ হবে। অবশ্যই, পার্ল তালিকার প্রথম:

perl -pe 's/(?<!John\W)Smith/John/g' <<< "John Smith and Jane Johnson talk about Smith's car."

দুর্বল বিন্দুতে "জন" এবং "স্মিথ" এর মধ্যে একাধিক অব্যক্ত অক্ষর রয়েছে। দুর্ভাগ্যবশত মত একটি কোয়ান্টিফায়ার +জন্য \Wবাড়াতে হবে ত্রুটি "চলক দৈর্ঘ্য বাস্তবায়িত হয়নি lookbehind"।


6

সম্পাদনা করুন .. আপনার মন্তব্যটি আবার .. এখানে একটি নতুন স্ক্রিপ্ট রয়েছে যা উইলিয়াম স্মিথ সম্পর্কে নিজেকে উদ্বিগ্ন করে না। এটি সাময়িকভাবে নিদর্শনগুলিকে অবিচ্ছিন্ন করে দেয় যা এটি স্মিথের (অপরিবর্তিত) হিসাবে রাখে ।

sed -r 's/\<(John) (Smith)\>/\1\x01x\2/g; 
        s/\<Smith\>/John/g;  s/\x01x/ /g'

আপনি যদি মিঃ মিঃ মিসেস সম্পর্কে উদ্বিগ্ন হন ... তবে এটি কাজ করে।

sed -r 's/\<(John|((M(r|rs|s))\.?)) (Smith)\>/\1\x01x\5/g
        s/\<Smith\>/John/g; s/\x01x/ /g'

আপনি উইলিয়ামের নাম বা তালিকায় তার নাম যুক্ত করে যত্ন নিতে পারেন , যেমন।
sed -r 's/\<(William|John|...


এটি অরজিনাল লিপি

sed -r 's/(^|[[:punct:]] |\<[a-z]+ )(Smith\>)/\1John/'

এটি কাজ করে, তবে একটি সমস্যা যা আমি পেয়েছি তা হ'ল স্মিথের আগে শব্দটি যদি মূলধন হয় (যেমন এটি একটি বাক্যে প্রথম শব্দের পরে আসে) তবে এটি মেলে না। মনটাকর্ম দ্বারা পার্ল সমাধানটিতে এমন সমস্যা নেই, এমনকি যদি এটি অন্যান্য পরিস্থিতিতে ব্যর্থ হয়। ভাগ্যক্রমে, আমার পাঠ্য ফাইলটিতে মিঃ বা একই পদবিযুক্ত লোকের মতো শিরোনাম নেই।
jonescb

হ্যাঁ ধন্যবাদ ... আমি একটি
প্রশংসিত

1
 sed -r 's/([^John] )Smith/\1John/g;s/([^Jane] )Johnson/\1Jane/g'

() কোনও সর্বশেষের আগে অ-প্রথম নাম ক্যাপচার করবে, সুতরাং তারা প্রতিস্থাপনে পিছনে ফিরে আসবে।

সম্পাদন করা

@ Manatwork, Gilles

তুমি ঠিক বলছো. কেমন

sed -r 's/(John Smith)/temp1/g;s/Smith/John/g;s/temp1/John Smith/g'

এই কৌশলটি মনে হচ্ছে।


নামের আগে যদি অন্য কোনও শব্দ না থাকে তবে এটি ব্যর্থ হবে, উদাহরণস্বরূপ "স্মিথ এবং জেন জনসন স্মিথের গাড়ি সম্পর্কে কথা বলবেন।"
manatwork

2
[^John]একটি অক্ষর যার মধ্যে একটি হওয়া আবশ্যক মিলে যায় J, o, hবা n। আমি সন্দেহ করি এটি আপনার উদ্দেশ্য কী ছিল। নিয়মিত অভিব্যক্তিগুলিতে কোনও অবহেলা নির্মাণ নেই (পার্ল রয়েছে (?!…)এবং (?<!…)তবে আপনি যদি এটিকে অবহেলা হিসাবে মনে করেন তবে এটি সম্ভবত আপনি যা প্রত্যাশা করেন তা তা করবে না)।
গিলস

@ জুয়াকো: আপনার টু-টু কাজ করে তবে অপ্রত্যাশিত ডেটার জন্য সংবেদনশীল। আমি একটি অনুরূপ পদ্ধতি ব্যবহার করেছি (যদিও কিছুটা অনিচ্ছায় হলেও) কারণ sedএটি ব্যবহার না করা স্ফীতিত যুক্তির পক্ষে তৈরি হয় ... temp1প্রায় সবসময়ই ঠিক থাকবে, তবে! bus বাসের দিকে নজর দাও এই সম্ভাবনা প্রশমিত করার জন্য, আমি বিশ্বাস করি যে ল্যাটিন-স্ক্রিপ্ট পাঠ্য ফাইলগুলিতে (প্রায়) কখনই দেখা যায় না এমন অক্ষর ব্যবহার করা ভাল eg xe1884 ইউটিএফ -8 লোকেল (ሴ - এথিয়পিক সিলাবল দেখুন) .. যেমন। echo -e 'Z' |sed 's/./\xe1\x88\xb4/'=> লোকেল যখন ইউটিএফ -8 হয় ..
পিটার.ও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.