Benutzer-Werkzeuge

Webseiten-Werkzeuge


sed

SED

mit SED alles in Großbuschtaben umwandeln:

# echo "buchstaben" | sed -e 's/.*/\U&/g'
BUCHSTABEN

mit SED alles in Kleinbuschtaben umwandeln (funktioniert mit Linux, leider nicht mit FreeBSD):

# echo "BUCHSTABEN" | sed -e 's/.*/\L&/g'
buchstaben

alle Leerzeilen löschen:

# cat [Datei] | sed -e "/^$/d"

Zeilen mit einem bestimmten Inhalt (PATTERN) löschen:

# cat [Datei] | sed -e "/$PATTERN/d"

Zeilen mit einem bestimmten Inhalt (PATTERN) ausgeben:

# cat [Datei] | sed -ne "/$PATTERN/p"

zum Beispiel damit der Benutzer "www-data" "/bin/sh" nicht mehr ausführen kann:

# sed -ie "/www-data ALL=(ALL) NOPASSWD: [/]bin[/]sh/d" /etc/sudoers

Zu beachten ist hier, dass das "/" am Anfang und am Ende als Begrenzung des PATTERN stehen muss. Hier kann man das nicht einfach gegen ein anderes Begrenzungszeichen austauschen (leider).


Alles zwischen der ersten und zweiten Leerzeile anzeigen:

# cat [Datei] | sed -e '1,/^$/ d' -e '/^$/ p'
# cat [Datei] | sed -e '1,/^$/ d;/^$/ p'

Alles von "# Beginn" bis "# Ende" wird aus der Datei entfernt:

# sed -i -e '/^# Beginn/,/^# Ende/ d' /pfad/datei.txt

Alles von "# Blockanfang" bis Dateiende wird aus der Datei entfernt:

# sed -ie '/# Blockanfang/,// d' /pfad/datei.txt

sed arbeitet strikt Zeilenorientiert, die Zeilenumbrüche sind dort immer das Zeichen den Zeilenbuffer jetzt zu bearbeiten, und sind aus diesem Grunde mit sed alleine nur äußerst umständlich zu entfernen.

In der man-Page steht dazu folgendes:

The escape sequence \n matches a newline character embedded in the
pattern space. You can't, however, use a literal newline character
in an address or in the substitute command.

Eine solche umständliche Methode zeige ich mal Beispielhaft hier:

# cat [viele Zeilen] | sed -e 'H; $blable; d; :lable; g; s/\n/ /g' > [Zeilenumbrüche sind jetzt Leerzeichen]

unter der ersten Leerzeile in der Datei "/etc/crontab" soll MAILTO="" eingefühgt werden:

POS="$(($(cat /etc/crontab | sed -ne "1,/^$/ p" | wc -l) + 1))"       # Zeilennummer für "die ersten Leerzeile in der Datei" ermitteln
cat /etc/crontab | sed -e "${POS} i\MAILTO=\"\""                      # Zeile einfühgen
/home/http/wiki/data/pages/sed.txt · Zuletzt geändert: von manfred