BASH
(→BASH) |
(→(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.) |
||
| Zeile 4: | Zeile 4: | ||
sed -e '/^ABC/d' eingabedatei.txt > ausgabedatei.txt | sed -e '/^ABC/d' eingabedatei.txt > ausgabedatei.txt | ||
''Vorsicht:'' ist die Eingabedatei gleich der Ausgabedatei, dann wird die Ausgabedatei am Ende leer sein. :-( | ''Vorsicht:'' ist die Eingabedatei gleich der Ausgabedatei, dann wird die Ausgabedatei am Ende leer sein. :-( | ||
| + | |||
| + | ==Bash Bashing== | ||
| + | |||
| + | Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar. | ||
| + | Interessante Beiträge aus der gleichnamigen Beitragsserie des Linux-Magazins und weitere Anregungen folgen hier in Kurzform. | ||
| + | |||
| + | ===cut, sed, grep & Co. vermeiden=== | ||
| + | |||
| + | Quelle: Folge 5, Linux-Magazin 02/10 | ||
| + | |||
| + | ====Parameter-Expansion==== | ||
| + | |||
| + | Nach dem Schema ${<Var><Zeichen><Suchmuster>} erledigt die Bash viele Aufgaben selbst, die sonst mit cut, sed, grep oder awk gelöst werden. | ||
| + | Als Zeichen # % / ^ , zulässig, die doppelte Angabe schaltet jeweils in den gierigen Modus und ersetzt alles bis zum letzten Vorkommen des Suchmusters. | ||
| + | |||
| + | {|border="1" | ||
| + | ! Zeichen | ||
| + | ! Bedeutung | ||
| + | ! Beispiel | ||
| + | |- | ||
| + | | # | ||
| + | | Löschen von links | ||
| + | | X="aabcabcc"; ${X#a}; löscht das erste a | ||
| + | |- | ||
| + | | ## | ||
| + | | Löschen von links | ||
| + | | X="aabcabcc"; ${X##a}; löscht alle führenden a (funktioniert in Bash 3.2 nicht, wo ist der Fehler?) | ||
| + | |- | ||
| + | | % | ||
| + | | Löschen von rechts | ||
| + | | X="aabcabcc"; ${X%c}; löscht das letzte c | ||
| + | |- | ||
| + | | %% | ||
| + | | Löschen von rechts | ||
| + | | X="aabcabcc"; ${X%c}; löscht alle c am Ende (funktioniert in Bash 3.2 nicht, wo ist der Fehler?) | ||
| + | |- | ||
| + | | / | ||
| + | | Ersetzen (substitude) | ||
| + | | X="aabcabcc"; ${X/b/d}; ersetzt 1. b durch d | ||
| + | |- | ||
| + | | / | ||
| + | | Ersetzen (substitude) | ||
| + | | X="aabcabcc"; ${X/b}; löscht 1. b | ||
| + | |- | ||
| + | | // | ||
| + | | Ersetzen (substitude) | ||
| + | | X="aabcabcc"; ${X//b/d}; ersetzt alle b durch d | ||
| + | |- | ||
| + | | // | ||
| + | | Ersetzen (substitude) | ||
| + | | X="aabcabcc"; ${X//b}; löscht alle b | ||
| + | |- | ||
| + | ! | ||
| + | ! funktioniert erst ab Bash 4 | ||
| + | ! | ||
| + | |- | ||
| + | | ^ | ||
| + | | Umwandeln in Großbuchstaben (uppercase) | ||
| + | | X="aabcabcc"; ${X^a}; wandelt erstes a in A | ||
| + | |- | ||
| + | | ^^ | ||
| + | | Umwandeln in Großbuchstaben (uppercase) | ||
| + | | X="aabcabcc"; ${X^^bc}; wandelt alle bc in BC | ||
| + | |- | ||
| + | | ^^ | ||
| + | | Umwandeln in Großbuchstaben (uppercase) | ||
| + | | X="aabcabcc"; ${X^^}; wandelt alles in Grossbuchstaben | ||
| + | |- | ||
| + | | , | ||
| + | | Umwandeln in Kleinbuchstaben (lowercase) | ||
| + | | X="AABCABCC"; ${X,A}; wandelt erstes A in a | ||
| + | |- | ||
| + | | ,, | ||
| + | | Umwandeln in Kleinbuchstaben (lowercase) | ||
| + | | X="AABCABCC"; ${X,,BC}; wandelt alle BC in bc | ||
| + | |- | ||
| + | | ,, | ||
| + | | Umwandeln in Kleinbuchstaben (lowercase) | ||
| + | | X="AABCABCC"; ${X,,}; wandelt alles in Kleinbuchstaben | ||
| + | |} | ||
| + | |||
| + | praktische Beispiele: | ||
| + | VERZEICHNIS="${0%/*}" | ||
| + | löscht alles bis zum ersten / von rechts | ||
| + | ersetzt: | ||
| + | VERZEICHNIS=$(dirname "$0") | ||
| + | |||
| + | SKRIPTNAME="${0##*/}" | ||
| + | löscht alles bis zum letzten / von links | ||
| + | ersetzt: | ||
| + | SKRIPTNAME=$(basename "$0") | ||
Version vom 25. Juli 2010, 10:25 Uhr
Inhaltsverzeichnis |
(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.
sed -e '/regex/command' eingabedatei > ausgabedatei
Bsp.: Alle Zeilen Löschen, in denen "ABC" am Anfang der Zeile steht.:
sed -e '/^ABC/d' eingabedatei.txt > ausgabedatei.txt
Vorsicht: ist die Eingabedatei gleich der Ausgabedatei, dann wird die Ausgabedatei am Ende leer sein. :-(
Bash Bashing
Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar. Interessante Beiträge aus der gleichnamigen Beitragsserie des Linux-Magazins und weitere Anregungen folgen hier in Kurzform.
cut, sed, grep & Co. vermeiden
Quelle: Folge 5, Linux-Magazin 02/10
Parameter-Expansion
Nach dem Schema ${<Zeichen><Suchmuster>} erledigt die Bash viele Aufgaben selbst, die sonst mit cut, sed, grep oder awk gelöst werden. Als Zeichen # % / ^ , zulässig, die doppelte Angabe schaltet jeweils in den gierigen Modus und ersetzt alles bis zum letzten Vorkommen des Suchmusters.
| Zeichen | Bedeutung | Beispiel |
|---|---|---|
| # | Löschen von links | X="aabcabcc"; ${X#a}; löscht das erste a |
| ## | Löschen von links | X="aabcabcc"; ${X##a}; löscht alle führenden a (funktioniert in Bash 3.2 nicht, wo ist der Fehler?) |
| % | Löschen von rechts | X="aabcabcc"; ${X%c}; löscht das letzte c |
| %% | Löschen von rechts | X="aabcabcc"; ${X%c}; löscht alle c am Ende (funktioniert in Bash 3.2 nicht, wo ist der Fehler?) |
| / | Ersetzen (substitude) | X="aabcabcc"; ${X/b/d}; ersetzt 1. b durch d |
| / | Ersetzen (substitude) | X="aabcabcc"; ${X/b}; löscht 1. b |
| // | Ersetzen (substitude) | X="aabcabcc"; ${X//b/d}; ersetzt alle b durch d |
| // | Ersetzen (substitude) | X="aabcabcc"; ${X//b}; löscht alle b |
| funktioniert erst ab Bash 4 | ||
| ^ | Umwandeln in Großbuchstaben (uppercase) | X="aabcabcc"; ${X^a}; wandelt erstes a in A |
| ^^ | Umwandeln in Großbuchstaben (uppercase) | X="aabcabcc"; ${X^^bc}; wandelt alle bc in BC |
| ^^ | Umwandeln in Großbuchstaben (uppercase) | X="aabcabcc"; ${X^^}; wandelt alles in Grossbuchstaben |
| , | Umwandeln in Kleinbuchstaben (lowercase) | X="AABCABCC"; ${X,A}; wandelt erstes A in a |
| ,, | Umwandeln in Kleinbuchstaben (lowercase) | X="AABCABCC"; ${X,,BC}; wandelt alle BC in bc |
| ,, | Umwandeln in Kleinbuchstaben (lowercase) | X="AABCABCC"; ${X,,}; wandelt alles in Kleinbuchstaben |
praktische Beispiele:
VERZEICHNIS="${0%/*}"
löscht alles bis zum ersten / von rechts
ersetzt:
VERZEICHNIS=$(dirname "$0")
SKRIPTNAME="${0##*/}"
löscht alles bis zum letzten / von links
ersetzt:
SKRIPTNAME=$(basename "$0")