Gezielten Teil eines Textblocks ändern

Fallout

Fallout

Doppel-As
Hi,

ich meine hier mal etwas ähnliches gesehen zu haben aber kann leider nix passendes finden. Es geht darum, die Mountoptionen eines bestimmten Mountpoints in der fstab zu ändern.
Zu Grunde liegt GNU bash, version 3.2.48(1)

Code:
[font=courier]
/dev/cciss/c0d0p2    swap                 swap       defaults              0 0
/dev/sysvg/root      /                    ext3       [b]defaults[/b]             1 1
/dev/cciss/c0d0p1    /boot                ext3       acl,user_xattr        1 2
/dev/sysvg/data      /data                reiserfs   defaults              1 2
/dev/sysvg/home      /home                ext3       defaults              1 2
/dev/sysvg/opt       /opt                 ext3       defaults              1 2
/dev/sysvg/tmp       /tmp                 ext3       defaults              1 2
/dev/sysvg/usr       /usr                 ext3       defaults              1 2
/dev/sysvg/var       /var                 ext3       defaults              1 2
proc                 /proc                proc       defaults              0 0
sysfs                /sys                 sysfs      noauto                0 0
debugfs              /sys/kernel/debug    debugfs    noauto                0 0
usbfs                /proc/bus/usb        usbfs      noauto                0 0
devpts               /dev/pts             devpts     mode=0620,gid=5       0 0
[/font]

soll z. B. werden zu:

Code:
[font=courier]
/dev/cciss/c0d0p2    swap                 swap       defaults              0 0
/dev/sysvg/root      /                    ext3       [b]noacl,relatime[/b]      1 1
/dev/cciss/c0d0p1    /boot                ext3       acl,user_xattr        1 2
/dev/sysvg/data      /data                reiserfs   defaults              1 2
/dev/sysvg/home      /home                ext3       defaults              1 2
/dev/sysvg/opt       /opt                 ext3       defaults              1 2
/dev/sysvg/tmp       /tmp                 ext3       defaults              1 2
/dev/sysvg/usr       /usr                 ext3       defaults              1 2
/dev/sysvg/var       /var                 ext3       defaults              1 2
proc                 /proc                proc       defaults              0 0
sysfs                /sys                 sysfs      noauto                0 0
debugfs              /sys/kernel/debug    debugfs    noauto                0 0
usbfs                /proc/bus/usb        usbfs      noauto                0 0
devpts               /dev/pts             devpts     mode=0620,gid=5       0 0
[/font]

Angesetzt habe ich mal ähnlich wie:
Code:
[font=courier]
mp='/'
file=/etc/fstab
regmp=$(echo $mp|sed 's#/#\\/#g')   # escape slashes
newopts='noacl,relatime'

oldline=$(awk "\$2~/^$regmp$/" $file)
newline=$(awk "\$2~/^$regmp$/" $file | awk "\$4=\"$newopts\"")
sed "s#$oldline#$newline#" $file
[/font]

Das Ganze funktioniert soweit scheinbar ganz gut - nun möchte ich aber ganz gerne natürlich noch die Optik einigermaßen halten sodaß zumindest bis zu den Mountoptions die Anzahl der Whitespaces eingehalten wird was aber scheinbar awk bei der Übergabe in die Variable auf das nötigste runterkürzt.
Also aus
Code:
[font=courier]/dev/sysvg/root      /                    ext3       defaults              1 1[/font]
wird
Code:
[font=courier]/dev/sysvg/root / ext3 noacl,relatime 1 1[/font]

Hat jemand eine Idee wie man das noch in den Griff bekommen könnte?

Gruß Daniel
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

[edit]
Hm, eine Idee wäre noch das Ganze so umzubauen daß nicht awk für die Ersetzung verwendet wird sondern sed:
Code:
[font=courier]
mp='/'
file=/etc/fstab
regmp=$(echo $mp|sed 's#/#\\/#g')   # escape slashes
newopts='noacl,relatime'

oldline=$(awk "\$2~/^$regmp$/" $file)
oldopts=$(awk "\$2~/^$regmp$/{print \$4}" $file)
newline=$(awk "\$2~/^$regmp$/" $file | sed "s#$oldopts#$newopts#")
sed "s#$oldline#$newline#" $file
[/font]
Zumindest werden die Whitespaces damit nicht beschnitten.

Gruß Daniel
 
Zuletzt bearbeitet:
Hi,

awk kennt die Variable OFS, damit kannst du den output field separator festlegen, den koenntest du z.B. auf ein tab setzen. Auch nicht optimal, aber minimal besser.

mfg,
bytepool
 

Ähnliche Themen

E/A-Fehler (.snapshots is not a btrfs subvolume).

Keine grafische Oberfläche (Debian Installation)

Festplatte auf SD Karte umziehen

SSD auf einen (geringfügig) kleineren USB-Stick wiederherstellen

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Zurück
Oben