Du bist nicht angemeldet.

#1 15.11.2020 12:14:21

Blowback
Mitglied

[SOLVED] Anführungszeichen bei sed escapen

Hallo,

Ich möchte automatisiert den Eintrag in /etc/default/grub für Rechner mit LVM und Verschlüsselung anpassen. Dabei wird $lvm_disk davor mittels einer Abfrage und "read disk_lvm" auf z.B. /dev/sda1 festgelegt.

Mit dem Folgenden Befehl wird ${lvm_disk} allerdings nicht expandiert sondern als text nach /etc/default/grub geschrieben.

$ sudo sed -i -e 's/GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet"/GRUB_CMDLINE_LINUX_DEFAULT="cryptdevice=${lvm_disk}:main:allow-discards loglevel=3 quiet"/g' /etc/default/grub

Die einfachen Anführungszeichen können hier nicht gegen zweifache ausgetauscht werden, und auch das Hinzufügen von backslashes vor den einfachen Anführungszeichen scheint nicht möglich zu sein:

$ sudo sed -i -e \'s/GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet"/GRUB_CMDLINE_LINUX_DEFAULT="cryptdevice=${lvm_disk}:main:allow-discards loglevel=3 quiet"/g\' /etc/default/grub
sed: -e expression #1, char 1: unknown command: `''

Habt Ihr einen Vorschlag, wie man es bewerkstelligen kann, dass ${lvm_disk} innerhalb der Anführungszeichen trotzdem als Variable genutzt wird?

FG

EDIT: Titel -> [SOLVED]

Beitrag geändert von Blowback (15.11.2020 15:02:23)

Offline

#2 15.11.2020 13:25:40

stefanhusmann
Moderator

Re: [SOLVED] Anführungszeichen bei sed escapen

Muss man das so kompliziert machen? Kann man nicht mit mehreren Dateien arbeiten, die man dann nur hin und her kopiert?

Ich habe auch nicht verstanden, warum sudo hier überhaupt im Spiel ist. Wenn du für den Vorgang root-Rechte brauchst, mache es als root.

Die Fehlermeldung

sed: -e expression #1, char 1: unknown command: `''

bedeutet jedenfalls, dass das ' als Kommando interpretiert wird. Das liegt daran, dass ein Backslash davor steht.

sed kann m.E. keine Shell-Variablen expandieren. awk hat für so etwas eine Syntax, oder man verwendet eine
bash-Funktion, die die expandierten Parameter übergibt.

https://stackoverflow.com/questions/700 … sed-script

Edit: Doch, sed kann Shell-Variablen expandieren. Man muss nur " statt ' verwenden.

https://askubuntu.com/questions/76808/h … ed-command

https://unix.stackexchange.com/question … ble-to-sed

Offline

#3 15.11.2020 15:01:37

Blowback
Mitglied

Re: [SOLVED] Anführungszeichen bei sed escapen

Vielen Dank, du hast absolut Recht!

tauscht man die einfachen Anführungszeichen gegen Doppelte aus, so hätte man theoretisch das richtige Komando für sed. Trotzdem wird dieser Befehl einen Fehler provozieren, da er zuerst durch die Shell interpretiert wird und diese Probleme mit den doppelten Anführungszeichen bei loglevel=3 quiet bzw. cryptdevice=$2:main:allow-discards loglevel=3 quiet bekomt:

$ sed -i -e "s/GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet"/GRUB_CMDLINE_LINUX_DEFAULT="cryptdevice=$2:main:allow-discards loglevel=3 quiet"/g" /etc/default/grub
sed: -e expression #1, char 39: unterminated `s' command

Diese problematischen Anführungszeichen muss man dann noch mittels backslashes maskieren und erhält den funktionierenden Befehl:

$ sudo sed -i -e "s/GRUB_CMDLINE_LINUX_DEFAULT=\"loglevel=3 quiet\"/GRUB_CMDLINE_LINUX_DEFAULT=\"cryptdevice=$2:main:allow-discards loglevel=3 quiet\"/g" /etc/default/grub

PS: Hierfür sind root-Rechte notwendig (Schreibrechte auf /etc/default/grub)!

@stefanhusmann
1.) Mit dem sudo hast du recht, war etwas hektisch ;)
2.) Ja, leider muss Das hier so kompliziert sein, da ich vor habe dies im Skript jeweils auf vielen (recht unterschiedlichen) Rechnern durchzuführen, die mal /dev/nvme0n* und mal /dev/sd* haben. Zudem schwankt auch das Partitionslayout hin und wieder ... und das Ganze auch noch möglichst automatisch ...

FG

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums