פורסם 2012 בדצמבר 2612 שנים שלום כולם,נתונים הקבצים הבאים בתיקיה:7b 7x8 7xyz3 7xyz4 7xyz5 7xyzw8 7xyzw8a ab P7.1 R8a z8aצריך להתקבל הפלט הבא:7xyz37xyz5abP7.1z8aז"א להתחיל באותיות קטנות בלבד ולהסתיים בספרות 1,3,5,7,9צריך להשתמש בפקודה grep וכך עשיתי:ls | egrep ^[a-z] "[1,3,5,7,9]$"כל אחת מהפקודות עובדת תקין - כיצד אני משלב בניהם בשביל לקבל פלט הנ"ל ?תודה.
פורסם 2012 בדצמבר 2612 שנים ניתן לכתוב כמה פקודות בשורה, ולעשות ביניהן "לוגיקה" :פקודה 1 תרוץ, כשהיא מסתימת פקודה 2 תרוץcommand 1 ; command 2פקודה 1 תרוץ, ואם היא נכשלה פקודה 2 תרוץcommand 1 || command 2פקודה 1 תרוץ, ואם היא הצליחה פקודה 2 תרוץcommand 1 && command 2כש grep לא מוצא משהוא שהוא מחפש, זה נחשב ל "כישלון"תנסה עכשו
פורסם 2012 בדצמבר 2612 שנים מחבר נסיתי את כל האפשרוית האלה ולא הצלחתי...אתה יכול לרשום לי איך זה צריך להיות?
פורסם 2012 בדצמבר 2712 שנים רמז נוסף : אתה רוצה להריץ 2 פקודות על כל אחד משמות הקבצים אחת אחריי השניה בסדר כזה :command1 on file1command2 on file1command1 on file2command2 on file2command1 on file3command2 on file3ולא כזה :command1 on file1command1 on file2command1 on file3command2 on file1command2 on file2command2 on file3ולכן את הלולאה אתה חייב לעשות על ידיי for משלך ולא להשאיר ל pgrep את תפקיד ביצוע הלולאה
פורסם 2012 בדצמבר 2712 שנים לולאת for???אלא אם כן יש פה ידע נוסף שלא מוצג בשאלה כל זה נראה לי תמוה.1. grep לבד יודע להתמודד עם המין שהתבקש.2. בעצם גם ls (או למעשה הshell) יכול לעשות את זה גם ללא עזרת grep.3. לא 7xyz3 וגם לאP7.1 עומדים בקריטריון שהגדרת.
פורסם 2012 בדצמבר 2712 שנים הדגמה בדרך לפתרון. תמשיך לבד[ash@viridian ~]$ mkdir new\ folder[ash@viridian ~]$ cd new\ folder[ash@viridian new folder]$ touch 7b[ash@viridian new folder]$ touch 7x8[ash@viridian new folder]$ touch 7xyz3[ash@viridian new folder]$ touch 7xyz4[ash@viridian new folder]$ touch 7xyz5[ash@viridian new folder]$ touch 7xyzw8[ash@viridian new folder]$ touch 7xyzw8a[ash@viridian new folder]$ touch ab[ash@viridian new folder]$ touch P7.1[ash@viridian new folder]$ touch R8a[ash@viridian new folder]$ touch z8a[ash@viridian new folder]$ ls7b 7x8 7xyz3 7xyz4 7xyz5 7xyzw8 7xyzw8a ab P7.1 R8a z8a[ash@viridian new folder]$ for i in `ls` ; do echo $i ; done7b7x87xyz37xyz47xyz57xyzw87xyzw8aabP7.1R8az8a[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[7] ; done7b7x87xyz37xyz47xyz57xyzw87xyzw8a[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[R,P] ; doneP7.1R8a[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[R,P] ; echo --$i ; done--7b--7x8--7xyz3--7xyz4--7xyz5--7xyzw8--7xyzw8a--abP7.1--P7.1R8a--R8a--z8a[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[R,P] || echo --$i ; done--7b--7x8--7xyz3--7xyz4--7xyz5--7xyzw8--7xyzw8a--abP7.1R8a--z8a[ash@viridian new folder]$ for i in `ls` ; do echo $i |egrep ^[R,P] && echo --$i ; doneP7.1--P7.1R8a--R8a
פורסם 2012 בדצמבר 2912 שנים מחבר הבעיה היא שבחירת הקבצים היא רנדומלית.. פשוט צריך להתאים לתנאים ולפי מה שהבנתי אין צורך להשתמש בלולאה..זה הכי קרוב שהגעתי אבל זה לא עובד לי...ls | grep "^[a-z].*[13579]$"
פורסם 2012 בדצמבר 2912 שנים אם יש לך דרך לתת ל egrep הוראה כזאת :"תחפש משהוא שעונה על (תנאי1 ו תנאי2) או (תנאי3 ו תנאי4)"אתה יכול לכתוב אותה ואז לא צריך for וכדומההבעיה היא אם אתה לא יכול (או שאי אפשר, או לא יודע איך) לאמר ל egrep "ו" ו "או", כך שהוא גם יבין מה אתה רוצה ממנואת ה "ו" ניתן לממש בקלות, על ידיי הפעלת 2 egrepים אחד על השני, כמו 2 מסננים בטור :"תחפש משהוא שעונה על תנאי1 |תחפש (מתוך זה) משהוא שעונה על תנאי2"נשארת שאלה איך לממש את ה "או". אני לא מתמצא ב regexps ולכן אני לא חיפשתי פתרון על ידי regexp, אלא פתרון שעובד ברמה של ה comman lineבמקום ה "או" שאנחנו רוצים, ניתן לכתוב "אם נכשלת", ולקבל פקודה כזאת :"תחפש משהוא שעונה על (תנאי1 ו תנאי2), אם נכשלת תחפש משהוא שעונה על (תנאי3 ו תנאי4)"ואת זה ניתן לכתוב ב bash :, אבל אנחנו רוצים לולאה חיצונית שתריץ את זה כי אנחנו רוצים שה "תחפש, אם נכשלת תחפש" ירוץ על כל קובץ בודד ולא על כל הקבצים ואז שוב על כל הקבצים (אחרת אם יש קובץ שעונה לכל התנאים, הוא יופיע בתוצאה יותר מפעם אחת ואת זה אנחנו לא רוצים)ביחד זה יוצא דבר כזה :"תעבור על כל הקבציםבכל שם קובץ בודד,"תחפש משהוא שעונה על (תנאי1 ו תנאי2), אם נכשלת תחפש משהוא שעונה על (תנאי3 ו תנאי4)"או ב bash :for i in `ls`doecho $i |egrep condition1 |egrep condition2 || echo $i |egrep condition3 |egrep condition4done
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.