انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => انجمن عمومی => نویسنده: Silvio Dante در 03 مهر 1397، 02:20 ب‌ظ

عنوان: جدا کردن دقیق نتیجه‌ی رجکس با sed [حل شد]
ارسال شده توسط: Silvio Dante در 03 مهر 1397، 02:20 ب‌ظ
درود
دوستان فرض کنید یه فایل داریم که حاوی متن زیر هست:
1, Justin Timberlake, Title 545, Price $7:30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
4, Lady Gaga, Title 118, Price $7:30
5, Johnny Trash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7:30
7, John Lennon, Title 271, Price $7.90
حالا فرض کنید من می‌خوام کلمه‌ی Timberlake رو از داخل این متن جدا کنم اما فقط یکی دو حروف از اول و آخرش رو می‌دونم، منطقا میام این کار رو می‌کنم:
➜  ~ sed -n '/Ti.*ke/p' file 
1, Justin Timberlake, Title 545, Price $7:30

اما همونطور که می‌بینید sed کل اون خط رو برای من برمی‌گردونه. حالا اگه من نخوام کل خط رو نمایش بده و فقط کلمه‌ای که با استفاده از اون رجکس بهش اشاره کردم رو نمایش بده، باید از چه راهکاری استفاده کنم؟
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
ارسال شده توسط: nino در 03 مهر 1397، 03:11 ب‌ظ
در مورد sed زیاد بلد نیستم و با جستجویی که کردم چیزی گیرم نیومد.
ولی تا اونجایی که الان دیدم، فعلا اضافه کردن grep می تونه کارتو راه بندازه:
sed -n '/Ti.*ke/p' <file> | grep -o Ti.*ke
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
ارسال شده توسط: سلمان م. در 03 مهر 1397، 03:27 ب‌ظ
در مورد sed زیاد بلد نیستم و با جستجویی که کردم چیزی گیرم نیومد.
ولی تا اونجایی که الان دیدم، فعلا اضافه کردن grep می تونه کارتو راه بندازه:
sed -n '/Ti.*ke/p' <file> | grep -o Ti.*ke

همین دستوری که با grep نوشتی کل کار رو انجام می‌ده دیگه! چرا اولش sed گذاشتی؟
$ grep -o Ti.*ke <file>
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
ارسال شده توسط: nino در 03 مهر 1397، 03:51 ب‌ظ
همین دستوری که با grep نوشتی کل کار رو انجام می‌ده دیگه! چرا اولش sed گذاشتی؟
$ grep -o Ti.*ke <file>
آره همینطوره. به این دقت نکرده بودم!
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
ارسال شده توسط: M!lad در 03 مهر 1397، 04:56 ب‌ظ
برای استخراج یک پترن از grep استفاده میشه ولی اگر دوست داری حتما با sed این کار رو انجام بدی، این یک راه‌اش هست:

sed -nr 's/.*(Ti.*ke).*/\1/p' file
فقط توجه کنید اگر تو یک خط کلمه مورد نظر چند بار تکرار شده باشه تنها یک بار اون رو بر‌می‌گردونه.
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
ارسال شده توسط: Silvio Dante در 03 مهر 1397، 11:05 ب‌ظ
سپاس دوستان
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed [حل شد]
ارسال شده توسط: Silvio Dante در 03 مهر 1397، 11:54 ب‌ظ
فقط یه سوال دیگه برام پیش اومده  ;D
من می‌خواستم اگر مقداری که رجکس بهش اشاره می‌کنه، چندین بار هم در کل فایل اومده بود فقط اولیشو برگردونه که با راهکاری که @ M!lad ارائه دادن این کار رو انجام دادم.
حالا سوالم اینه که با grep هم میشه این کار رو کرد؟
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed [حل شد]
ارسال شده توسط: nino در 04 مهر 1397، 12:18 ق‌ظ
فقط یه سوال دیگه برام پیش اومده  ;D
من می‌خواستم اگر مقداری که رجکس بهش اشاره می‌کنه، چندین بار هم در کل فایل اومده بود فقط اولیشو برگردونه که با راهکاری که @ M!lad ارائه دادن این کار رو انجام دادم.
حالا سوالم اینه که با grep هم میشه این کار رو کرد؟
ببین این کمک می کنه:
grep -o <string> <file> | head -1

اگه نشد یه نگاهی به این آدرس بنداز:
https://stackoverflow.com/questions/14093452/grep-only-the-first-match-and-stop
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed [حل شد]
ارسال شده توسط: M!lad در 04 مهر 1397، 01:18 ق‌ظ
با توجه با اینکه فایلت ساختار خاصی داره awk به نظر گزینه مناسب تری میاد اینجا:

awk -F, '$2~/Timber/ {print $2; exit;}'
به جای Timber میتونی regex بنویسی.

اگر با grep میخوای اولین match تو کل فایل:

grep -Pio -m 1 'tim.*?ke'
اگر توی یک خط الگو تکرار شده پایپ کن نتیجه رو به head

grep -Pio -m 1 'tim.*?ke' file | head -1
اگر از هر خط فقط اولی رو میخوای:

grep -Pnio 'tim.*?ke' file | uniq | cut -f2 -d:
عنوان: پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed [حل شد]
ارسال شده توسط: Silvio Dante در 04 مهر 1397، 11:38 ق‌ظ
خیلیم عالی
تشکر دوباره از همگی  :oops: