Mit dem Programm sed
lässt sich Text manipulieren.
Hier einige Beispiel Skripssnipsel.
Wenn man eine Variable übergeben möchte z.B. mit read
dann muss der Anweisungsstring für sed
in doppelten Anführungszeichen angegeben werden. Auch regular expressions funktionieren im Anweisungsstring
read -p "servername angeben: " svr; sed "s/^$svr|[0-9]\+/$svr|1/g" <DATEINAME>; cat <DATEINAME>
regexp | Bedeutung |
---|---|
^ | suche am Zeilenanfang |
[0-9] | suche nach einer Ziffer 0-9 |
\+ | suche nach einer Zahl, die aus einer oder mehreren o.g. Ziffern bestehen kann |
In diesem Beispiel legt man sich eine Testdatei wie folgt an:
servername1|0 servername2|3 servername6|11 ...
Der o.g. sed-String würde nach einem Servernamen fragen und dann die Zahl hinter dem „|“ durch eine „1“ ersetzen.
Wenn der Inhalt einer Datei, mit Sed, direkt geändert werden soll, muss dem Sed-String noch der Parameter -i
hinzugefügt werden.
Hier anhand des Beispiels von oben:
... sed -i "s/^$svr|[0-9]\+/$svr|1/g" <DATEINAME>; cat <DATEINAME>
Ersetze „was“ mit „etwas“ NUR in Zeilen die „wo“ enthalten
sed '/wo/s/etwas/et#was/g'
Ersetze „foo“ mit „bar“ AUSSER in Zeilen die „baz“ enthalten
sed '/wo/!s/etwas/et#was/g'
Mehrfache Suchausdrücke in einem Befehl
sed 's/<SUCHBEGRIFF>//;s/<SUCHBEGRIFF>//'
Mit find
lassen sich verschiedene Suchergebnisse erzielen z.B. suchen nach allen Dateien in einer Ordnerstruktur. Die Suchergebnisse lassen sich dann mit dem Parameter -exec
weiterverarbeiten.
find . -type f -exec sed -ie 's!<SUCHSTRING>!<SUCHSTRING>!g' {} \;
sed -i~ -r '/^#?<SUCHBEGRIFF>/,+2 s/^/#/' <DATEINAME>
sed -i~ -r '/^#?<SUCHBEGRIFF>/,+2 s/^#+//' <DATEINAME>
sed -i -r '/^<SUCHSTRING>/ i <TEXT_AUCH_LEERZEICHEN_GETRENNT>' <DATEINAME>
sed -i -r '/^<SUCHSTRING>/ a <TEXT_AUCH_LEERZEICHEN_GETRENNT>' <DATEINAME>
Hiermit wird am Beispiel: „bla test 20130607215015 some text“ die Zahl von hinten, an jeder 3. Stelle, mit einem Komma versehen.
echo "bla test 20130607215015 some text" | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta'
Das Ergebnis sieht dann so aus:
bla test 20,130,607,215,015 some text
Möchte man hingegen nur ein Komma setzen, kann dies wie folgt ausgeführt werden.
echo 2346455736745 | sed 's/\B[0-9]\{3\}\>/,&/'
Ergebnis aus „asdftt 2346455736745 asdfgg 34567889“
asdftt 2346455736,745 asdfgg 34567889
Wenn man alles Zahlen finden und ersetzen möchte, fügt man dem sed
Befehl noch ein „g“ hinzu.
echo 2346455736745 | sed 's/\B[0-9]\{3\}\>/,&/g'
Ergebnis aus „asdftt 2346455736745 asdfgg 34567889“
asdftt 2346455736,745 asdfgg 34567,889