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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: جدا کردن دقیق نتیجه‌ی رجکس با sed [حل شد]  (دفعات بازدید: 498 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین Silvio Dante

  • High Hero Member
  • *
  • ارسال: 1221
  • جنسیت : پسر
  • Arch Linux
    • وبلاگ شخصی
درود
دوستان فرض کنید یه فایل داریم که حاوی متن زیر هست:
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 کل اون خط رو برای من برمی‌گردونه. حالا اگه من نخوام کل خط رو نمایش بده و فقط کلمه‌ای که با استفاده از اون رجکس بهش اشاره کردم رو نمایش بده، باید از چه راهکاری استفاده کنم؟
« آخرین ویرایش: 03 مهر 1397، 11:05 ب‌ظ توسط Silvio Dante »
به ما نگفته بودند ایران در زمان احمدشاه قاجار چگونه بوده است. همیشه به ما دادند، ما هم فکر کردیم باید می‌داده‌اند و تازه خیال می‌کردیم کم‌مان است باز هم می‌خواستیم!!
فریدون فرخزاد

آفلاین nino

  • Full Member
  • *
  • ارسال: 224
  • جنسیت : پسر
    • Gitlab
پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
« پاسخ #1 : 03 مهر 1397، 03:11 ب‌ظ »
در مورد sed زیاد بلد نیستم و با جستجویی که کردم چیزی گیرم نیومد.
ولی تا اونجایی که الان دیدم، فعلا اضافه کردن grep می تونه کارتو راه بندازه:
sed -n '/Ti.*ke/p' <file> | grep -o Ti.*ke
...

آفلاین سلمان م.

  • ناظر انجمن
  • *
  • ارسال: 4106
  • جنسیت : پسر
  • GNU Operating System - سیستم عامل گنو
پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
« پاسخ #2 : 03 مهر 1397، 03:27 ب‌ظ »
در مورد sed زیاد بلد نیستم و با جستجویی که کردم چیزی گیرم نیومد.
ولی تا اونجایی که الان دیدم، فعلا اضافه کردن grep می تونه کارتو راه بندازه:
sed -n '/Ti.*ke/p' <file> | grep -o Ti.*ke

همین دستوری که با grep نوشتی کل کار رو انجام می‌ده دیگه! چرا اولش sed گذاشتی؟
$ grep -o Ti.*ke <file>

آفلاین nino

  • Full Member
  • *
  • ارسال: 224
  • جنسیت : پسر
    • Gitlab
پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
« پاسخ #3 : 03 مهر 1397، 03:51 ب‌ظ »
همین دستوری که با grep نوشتی کل کار رو انجام می‌ده دیگه! چرا اولش sed گذاشتی؟
$ grep -o Ti.*ke <file>
آره همینطوره. به این دقت نکرده بودم!
...

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
« پاسخ #4 : 03 مهر 1397، 04:56 ب‌ظ »
برای استخراج یک پترن از grep استفاده میشه ولی اگر دوست داری حتما با sed این کار رو انجام بدی، این یک راه‌اش هست:

sed -nr 's/.*(Ti.*ke).*/\1/p' file
فقط توجه کنید اگر تو یک خط کلمه مورد نظر چند بار تکرار شده باشه تنها یک بار اون رو بر‌می‌گردونه.
« آخرین ویرایش: 03 مهر 1397، 05:08 ب‌ظ توسط M!lad »
..I feel no fault for the fault I feel..

آفلاین Silvio Dante

  • High Hero Member
  • *
  • ارسال: 1221
  • جنسیت : پسر
  • Arch Linux
    • وبلاگ شخصی
پاسخ : جدا کردن دقیق نتیجه‌ی رجکس با sed
« پاسخ #5 : 03 مهر 1397، 11:05 ب‌ظ »
سپاس دوستان
به ما نگفته بودند ایران در زمان احمدشاه قاجار چگونه بوده است. همیشه به ما دادند، ما هم فکر کردیم باید می‌داده‌اند و تازه خیال می‌کردیم کم‌مان است باز هم می‌خواستیم!!
فریدون فرخزاد

آفلاین Silvio Dante

  • High Hero Member
  • *
  • ارسال: 1221
  • جنسیت : پسر
  • Arch Linux
    • وبلاگ شخصی
فقط یه سوال دیگه برام پیش اومده  ;D
من می‌خواستم اگر مقداری که رجکس بهش اشاره می‌کنه، چندین بار هم در کل فایل اومده بود فقط اولیشو برگردونه که با راهکاری که @ M!lad ارائه دادن این کار رو انجام دادم.
حالا سوالم اینه که با grep هم میشه این کار رو کرد؟
به ما نگفته بودند ایران در زمان احمدشاه قاجار چگونه بوده است. همیشه به ما دادند، ما هم فکر کردیم باید می‌داده‌اند و تازه خیال می‌کردیم کم‌مان است باز هم می‌خواستیم!!
فریدون فرخزاد

آفلاین nino

  • Full Member
  • *
  • ارسال: 224
  • جنسیت : پسر
    • Gitlab
فقط یه سوال دیگه برام پیش اومده  ;D
من می‌خواستم اگر مقداری که رجکس بهش اشاره می‌کنه، چندین بار هم در کل فایل اومده بود فقط اولیشو برگردونه که با راهکاری که @ M!lad ارائه دادن این کار رو انجام دادم.
حالا سوالم اینه که با grep هم میشه این کار رو کرد؟
ببین این کمک می کنه:
grep -o <string> <file> | head -1

اگه نشد یه نگاهی به این آدرس بنداز:
« آخرین ویرایش: 04 مهر 1397، 12:23 ق‌ظ توسط Nino »
...

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
با توجه با اینکه فایلت ساختار خاصی داره 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:
« آخرین ویرایش: 04 مهر 1397، 01:21 ق‌ظ توسط M!lad »
..I feel no fault for the fault I feel..

آفلاین Silvio Dante

  • High Hero Member
  • *
  • ارسال: 1221
  • جنسیت : پسر
  • Arch Linux
    • وبلاگ شخصی
خیلیم عالی
تشکر دوباره از همگی  :oops:
به ما نگفته بودند ایران در زمان احمدشاه قاجار چگونه بوده است. همیشه به ما دادند، ما هم فکر کردیم باید می‌داده‌اند و تازه خیال می‌کردیم کم‌مان است باز هم می‌خواستیم!!
فریدون فرخزاد