BASH

Aus ConfigWiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(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, 11: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")