Return the context and not just the matching lines

104 Views Asked by At

I tried to find this string in the verse.

.* चैव यत् .*

It returned 2 lines:

अभिसन्धाय तु फलं दम्भार्थमपि चैव यत् ।

सत्कारमानपूजार्थं तपो दम्भेन चैव यत् ।

But I need to return the complete paragraph. In this context it is the text between ॥

अभिसन्धाय तु फलं दम्भार्थमपि चैव यत् ।
इज्यते भरतश्रेष्ठ तं यज्ञं विद्धि राजसम् ॥ 17.12॥

सत्कारमानपूजार्थं तपो दम्भेन चैव यत् ।
क्रियते तदिह प्रोक्तं राजसं चलमध्रुवम् ॥ 17.18॥

The sample text:

दृष्ट्वा तु पाण्डवानीकं व्यूढं दुर्योधनस्तदा ।
आचार्यमुपसङ्गम्य राजा वचनमब्रवीत् ॥ १-२॥

पश्यैतां पाण्डुपुत्राणामाचार्य महतीं चमूम् ।
व्यूढां द्रुपदपुत्रेण तव शिष्येण धीमता ॥ १-३॥

अन्ये च बहवः शूरा मदर्थे त्यक्तजीविताः ।
नानाशस्त्रप्रहरणाः सर्वे युद्धविशारदाः ॥ १-९॥

अपर्याप्तं तदस्माकं बलं भीष्माभिरक्षितम् ।
पर्याप्तं त्विदमेतेषां बलं भीमाभिरक्षितम् ॥ १-१०॥


अभिसन्धाय तु फलं दम्भार्थमपि चैव यत् ।
इज्यते भरतश्रेष्ठ तं यज्ञं विद्धि राजसम् ॥ 17.12॥

अयनेषु च सर्वेषु यथाभागमवस्थिताः ।
भीष्ममेवाभिरक्षन्तु भवन्तः सर्व एव हि ॥ १-११॥

सत्कारमानपूजार्थं तपो दम्भेन चैव यत् ।
क्रियते तदिह प्रोक्तं राजसं चलमध्रुवम् ॥ 17.18॥

Update:

If I have plain text file with no line breaks like this...

दृष्ट्वा तु पाण्डवानीकं व्यूढं दुर्योधनस्तदा । आचार्यमुपसङ्गम्य राजा वचनमब्रवीत् ॥ १-२॥ पश्यैतां पाण्डुपुत्राणामाचार्य महतीं चमूम् । व्यूढां द्रुपदपुत्रेण तव शिष्येण धीमता ॥ १-३॥ अन्ये च बहवः शूरा मदर्थे त्यक्तजीविताः । नानाशस्त्रप्रहरणाः सर्वे युद्धविशारदाः ॥ १-९॥ अपर्याप्तं तदस्माकं बलं भीष्माभिरक्षितम् । पर्याप्तं त्विदमेतेषां बलं भीमाभिरक्षितम् ॥ १-१०॥ अभिसन्धाय तु फलं दम्भार्थमपि चैव यत् । इज्यते भरतश्रेष्ठ तं यज्ञं विद्धि राजसम् ॥ 17.12॥ अयनेषु च सर्वेषु यथाभागमवस्थिताः । भीष्ममेवाभिरक्षन्तु भवन्तः सर्व एव हि ॥ १-११॥ सत्कारमानपूजार्थं तपो दम्भेन चैव यत् । क्रियते तदिह प्रोक्तं राजसं चलमध्रुवम् ॥ 17.18॥

Is it possible to extract relevant verses (17.12 and 17.18)?

अभिसन्धाय तु फलं दम्भार्थमपि चैव यत् । इज्यते भरतश्रेष्ठ तं यज्ञं विद्धि राजसम् ॥ 17.12॥ सत्कारमानपूजार्थं तपो दम्भेन चैव यत् । क्रियते तदिह प्रोक्तं राजसं चलमध्रुवम् ॥ 17.18॥
3

There are 3 best solutions below

0
On BEST ANSWER

Using any awk that can handle multi-byte characters, e.g. GNU awk, in paragraph mode:

$ awk -v RS= -v ORS='\n\n' '/ चैव यत् /' file
अभिसन्धाय तु फलं दम्भार्थमपि चैव यत् ।
इज्यते भरतश्रेष्ठ तं यज्ञं विद्धि राजसम् ॥ 17.12॥

सत्कारमानपूजार्थं तपो दम्भेन चैव यत् ।
क्रियते तदिह प्रोक्तं राजसं चलमध्रुवम् ॥ 17.18॥
0
On

Using ripgrep with pcre2 enabled and asserting a whitespace boundary to the right with (?!\S)

(?<=॥ |^)(?:(?!\d[.-]\d+॥).)*?चैव यत्(?:(?!\d[.-]\d+॥).)*\d[.-]\d+॥(?!\S)

See a regex demo.


Or a shortened variation using (?1) repeating the expression defined in the first capture group and omitting the whitespace boundary to the right is that is unnecessary:

(?<=॥ |^)((?!\d[.-]\d+॥).)*?चैव यत्(?1)*\d[.-]\d+॥

The pattern matches:

  • (?<=॥ |^) Positive lookbehind, assert either ॥ or the start of the string to the left
  • ( Capture group 1
    • (?!\d[.-]\d+॥). Tempered greedy token, match any character if not directly followed by a digit, then either . or - and the 1+ digits followed by ॥
  • )*? Close group 1 and optionally repeat it, as few as possible times
  • चैव यत् Match literally
  • (?1)* Optionally repeat the expression defined in the first capture group
  • \d[.-]\d+॥ Match a digit, either .or-` 1+ digits and ॥

See another regex demo.

0
On

Another brain-bender to get the paragraph containing a special string.

(?m)^\s*\K(?:^.*\S.*\r?\n)*?^.*[ ]चैव[ ]यत्[ ].*(?:\r?\n^.*\S.*)*

https://regex101.com/r/eLNpw6/1

Overview

(?m)
^ \s* 
\K 
(?: ^ .* \S .* \r? \n )*?
^ .* [ ] चैव [ ] यत् [ ] .* 
(?: \r? \n ^ .* \S .* )*