אנדרואיד

כיצד להשתמש ב- sed כדי למצוא ולהחליף מחרוזת בקבצים

Davy Jones - Theme

Davy Jones - Theme

תוכן עניינים:

Anonim

לעתים קרובות למדי כשעבודה עם קבצי טקסט תצטרך למצוא ולהחליף מחרוזות טקסט בקובץ אחד או יותר.

sed הוא ספר מובהק. זה יכול לבצע מניפולציות טקסט בסיסיות על קבצים וזרמי קלט כגון צינורות. בעזרת sed תוכלו לחפש, למצוא ולהחליף, להוסיף ולמחוק מילים ושורות. זה תומך בביטויים רגילים מורחבים המאפשרים התאמה לדפוסים מורכבים.

, נדבר על איך למצוא ולהחליף מיתרים sed . אנו נראה לך כיצד לבצע חיפוש רקורסיבי ולהחליף אותו.

מצא והחלף מחרוזת sed

ישנן כמה גרסאות של sed , עם כמה הבדלים פונקציונליים ביניהם. macOS משתמש בגירסת BSD ורוב ההפצות לינוקס מגיעות עם GNU sed המותקן מראש כברירת מחדל. אנו נשתמש בגרסת ה- GNU.

הצורה הכללית של חיפוש והחלפת טקסט באמצעות sed מהצורה הבאה:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - כברירת מחדל כותב sed את הפלט שלו לפלט הסטנדרטי. אפשרות זו מורה ל- sed לערוך קבצים במקום. אם מסופק סיומת (ex -i.bak) ייווצר גיבוי של הקובץ המקורי. s - פקודת התחליף, כנראה הפקודה המשמשת ביותר ב- sed. / / / - אופי תוחם. זה יכול להיות כל תו, אך בדרך כלל משתמשים בתו הקצץ ( / ). SEARCH_REGEX - מחרוזת רגילה או ביטוי רגיל לחיפוש. החלפה - מחרוזת ההחלפה. g - דגל חלופי גלובלי. כברירת מחדל, sed קורא את הקובץ שורה אחר שורה ומשנה רק את המופע הראשון של SEARCH_REGEX בשורה. כאשר מסומן הדגל החלופי, כל המופעים יוחלפו. INPUTFILE - שם הקובץ עליו ברצונך להריץ את הפקודה.

זה שיטה טובה לשים ציטוטים סביב הוויכוח כך שתאי הדמויות של הקונכיות לא יתרחבו.

בוא נראה דוגמאות כיצד להשתמש בפקודת sed כדי לחפש ולהחליף טקסט בקבצים בכמה מהאפשרויות והדגלים הנפוצים ביותר שלה.

לצורך הפגנה אנו נשתמש בקובץ הבא:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

כאשר הדגל החלופי הגלובלי sed מחליף את כל המופעים של דפוס החיפוש:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

כפי שוודאי שמתם לב, בדוגמה הקודמת מוחלף גם foo המחרוזת בתוך מחרוזת foobar . אם זו לא ההתנהגות המבוקשת, השתמש בביטוי גבול המילה ( \b ) בשני קצוות מחרוזת החיפוש. זה מבטיח שהמילים החלקיות אינן תואמות.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

כדי להפוך את התאמת התבנית לבלתי רגישה, השתמש בסמל I. בדוגמה למטה אנו משתמשים בדגלי ה- g וגם I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

האפשרות הקלה והקראה הרבה יותר היא להשתמש בתו תוחם אחר. רוב האנשים משתמשים בסרגל האנכי ( | ) או במעי הגס (:) אך אתה יכול להשתמש בכל תו אחר:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

אתה יכול גם להשתמש בביטויים רגילים. לדוגמה כדי לחפש בכל המספרים 3 הספרות ולהחליף אותם number המחרוזת שתשתמש בהם:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

מאפיין שימושי נוסף של sed הוא שתוכלו להשתמש בתו אמפרסנד ואשר מתאים לתבנית המתאימה. ניתן להשתמש בתו מספר פעמים.

לדוגמה, אם ברצונך להוסיף סד מתולתל {} סביב כל מספר בן שלוש ספרות, הקלד:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

אחרון חביב, תמיד כדאי לבצע גיבוי בעת עריכת קובץ ב- sed . לשם כך פשוט ספק הרחבה לאפשרות -i . לדוגמה, כדי לערוך את file.txt ולשמור את הקובץ המקורי כ file.txt.bak היית משתמש:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

מצא והחלף רקורסיבי

לפעמים אתה רוצה לחפש ספריות באופן רקורסיבי אחר קבצים המכילים מחרוזת ולהחליף את המחרוזת בכל הקבצים. ניתן לעשות זאת באמצעות פקודות כגון find או grep כדי למצוא רקורסיבית קבצים בספריה וצנרת שמות הקבצים ל- sed .

הפקודה הבאה תחפש רקורסיבית קבצים בספריית העבודה הנוכחית ותעביר את שמות הקבצים ל- sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

כדי להימנע מבעיות עם קבצים המכילים מקום בשמם, השתמשו באפשרות -print0 find להדפיס את שם הקובץ, ואחריו תו null וצנרת את הפלט ל- sed באמצעות xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

כדי לא לכלול ספריה השתמש באפשרות- -not -path . לדוגמה, אם אתה מחליף מחרוזת ברשימות ה- git המקומיות שלך כדי לא לכלול את כל הקבצים המתחילים בנקודה ( . ), השתמש ב:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

אפשרות נוספת היא להשתמש בפקודה grep כדי למצוא רקורסיבית את כל הקבצים המכילים את תבנית החיפוש ואז לצנוב את שמות הקבצים ל- sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

סיכום

למרות שזה אולי נראה מורכב ומורכב, בהתחלה, חיפוש והחלפת טקסט בקבצים ב- sed הוא פשוט מאוד.

למידע נוסף על פקודות sed , אפשרות ודגלים בקר במדריך ה- GNU sed וב- Grymoire sed הדרכה. אם יש לך שאלות או משוב, אל תהסס להשאיר תגובה.

מסוף שקע