Bash: Zeile in Datei ersetzen/ändern (sed)

Mountainking02

Cadet 4th Year
Registriert
Nov. 2012
Beiträge
83
Hi,

ich hasse Regex Pattern :).
Ich brächte nun aber doch mal welche für den "sed" Befehl unter Arch.
Bastel mir gerade ein bash Script, dass Arch automatisiert installieren soll.

Problem 1 (sollte trivial sein :)):

In der "locale.gen" soll die Zeile "#de_DE.UTF-8 UTF-8" (ohne Quotes) einkommentiert werden. Also das # Zeichen entfernt werden.

Problem 2:

In der "mkinitcpio.conf" Datei möchte ich a) eine Zeile ersetzen oder b) als Luxusvariante einen String an einer bestimmten Stelle einfügen können.

a) Die Zeile beginnt mit "HOOKS=(" (ohne Quotes) und soll komplett ersetzt werden durch einen neuen HOOKS=... String.
b) In der Zeile "HOOKS=(base udev autodetect modconf block keyboard keymap filesystem fsck shutdown)" soll z. B. vor dem filesystem noch ein weiterer Wert "encrypt" eingefügt werden.
 
Ich habe dazu passenderweise gestern ein Video gesehen, eventuell hilft dir das?

 
  • Gefällt mir
Reaktionen: leonavis
Hey,

bei sed muss vor die Klammern für die Gruppierung auch ein Escape-Zeichen.

Code:
# 1
sed -i -e "s/#\(de_DE[.]UTF[-]8[ ]UTF[-]8\)/\1/" locale.gen

# 2
sed -i -e "s/\(HOOKS=(.*\)\(filesystem.*)\)/\1encrypt \2/" mkinitcpio.conf

HTH,
xpad
 
Code:
sed 's/#de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
sed 's/\(^HOOKS=".*\)\(filesystems.*\)/\1encrypt \2/' /etc/mkinitcpio.conf
 
Zuletzt bearbeitet:
Merci. Ich habe es noch in...

sed -i -e "s/^#.\(de_DE[.]UTF[-]8[ ]UTF[-]8\)/\1/" /etc/locale.gen

...geändert. Denn nach dem # ist wohl doch noch ein Space (zumindest gerade hier unter Debian). Und noch das "^" hinzugefügt damit es nur am Zeilenbeginn ersetzt wird. Das war es dann aber auch mit meinen Regex Kenntnissen :D.

Nochmal zu Problem 2. Da ich auch die Reihenfolge ändern muss brächte ich noch ein Regex um ein bestimmtes Wort aus den HOOKS zu entfernen. Z. B. das Wort "keyboard". Dieses würde ich dann mit den obigen Regex wieder an anderer Stelle hinzufügen.
 
Da ich auch die Reihenfolge ändern muss brächte ich noch ein Regex um ein bestimmtes Wort aus den HOOKS zu entfernen. Z. B. das Wort "keyboard".

Ja, dann böte es sich wohl an, dieses Schlüsselwort in einer eigenen Gruppe unterzubringen und die Reihenfolge in der Ersetzung zu ändern.
 
Warum so umständlich, wenn es auch einfach(er lesbar) geht? ;-)
Code:
sed -i '/#de_DE\.UTF-8 UTF-8/s/^#//' locale.gen
sed -i '/^HOOKS=/s/ filesystems/ encrypt filesystems/' /etc/mkinitcpio.conf

sed kann nach einer Zeile suchen (grün) und in dieser Zeile dann eine völlig andere Suchen/Ersetzen-Operation (rot) durchführen:
sed -i '/#de_DE\.UTF-8 UTF-8/s/^#//' locale.gen
 
Zurück
Oben