sed: Strings replacen

Patschi

New Member
Guten Tag!

Ich versuche seit längerer Zeit im Prinzip ein einfaches Problem zu lösen - weder Google noch viel Probiere hat mich bisher zum gewollten Ergebnis gebracht.

Der Hintergrund: Standardmäßig wird bei den VMware Tools das automatische Kernel-Modul-Update deaktiviert, was ich aber bei einer völlig automatisierten VMware-Tools-Installation explizit aktiviert haben möchte. Leider gibt es hierzu keine Parameter (zumindestens keine, die mir bekannt wären), um folgende Einstellung beim Aufruf der Tools-Installation standardmäßig zu aktivieren. Daher muss ich beim Installationsscript eben etwas tricksen und das Codestückchen eben an meine Anforderung anpassen...

Ich versuche folgendes:
Bei diesem Code
Code:
sub configure_auto_kmods {
   my $ans;
   my $msg = <<EOF;
VMware automatic kernel modules enables automatic building and installation of
VMware kernel modules at boot that are not already present. This feature can
be enabled/disabled by re-running vmware-config-tools.pl.

Would you like to enable VMware automatic kernel modules?
EOF

   $ans = get_persistent_answer($msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno',
                                'no');
   db_add_answer('AUTO_KMODS_ENABLED', $ans);
}

Möchte ich folgende Zeilen:
Code:
   $ans = get_persistent_answer($msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno',
                                'no');

...zu folgender Zeile ersetzen...

Code:
   $ans = get_persistent_answer($msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno', 'yes');

Ich hab bereits eine Menge versucht, aber leider hat bisher nichts geholfen...
Probiert habe ich zum Beispiel folgende sed-Syntax:

Code:
sed -i "N;s/get_persistent_answer(\$msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno',.*'no')/get_persistent_answer(\$msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno', 'yes')/g" bin/vmware-config-tools.pl

Danke für eure Hilfe!

LG,
Patrik
 
Last edited by a moderator:

d3p

Blog Benutzer
Dein sed-Command funktioniert doch einwandfrei.
Oder verstehe ich dein Problem gerade falsch?
 

Patschi

New Member
Naja, funktionieren tut der sed-Befehl nicht wirklich: Es spuckt zwar keine Fehlermeldung aus, aber tauscht auch nicht das zu ersetzende "no" auf das gewollte "yes".
 

d3p

Blog Benutzer
Naja, funktionieren tut der sed-Befehl nicht wirklich: Es spuckt zwar keine Fehlermeldung aus, aber tauscht auch nicht das zu ersetzende "no" auf das gewollte "yes".

Bei mir funktioniert es einwandfrei. ;)

Dort wird:
Code:
   $ans = get_persistent_answer($msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno', 'no');

Durch:
Code:
   $ans = get_persistent_answer($msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno', 'yes');
 

Patschi

New Member
Das kann nicht sein o_O Hier klappts nicht.

Nur zur Sicherheit: Hast du die "no-Zeile" inklusive der neuen Zeile und allen Leerzeichen kopiert oder ist der Part wirklich nur in einer Zeile, genauso wie du das in deinem ersten Code-Block hast?
 

Joe User

Zentrum der Macht
Ohne Deine Syntaxfehler funktioniert es bei mir wie gewünscht:
Code:
sed -e "N;s/'AUTO_KMODS_ENABLED_ANSWER', 'yesno',.*'no')/'AUTO_KMODS_ENABLED_ANSWER', 'yesno', 'yes')/g" -i bin/vmware-config-tools.pl
 

Joe User

Zentrum der Macht
Lässt sich auch noch elegant kürzen:
Code:
sed -e "N;s/\('AUTO_KMODS_ENABLED_ANSWER', 'yesno',.*\)'no'/\1'yes'/g" -i bin/vmware-config-tools.pl
 

Patschi

New Member
Jetzt bin ich noch mehr verwirrt :D

Selbst wenn ich es im nicht-interaktiven Modus versuche, klappt es nicht:
Code:
root@test:~/vmware/vmware-tools-distrib# sed -e "N;s/'AUTO_KMODS_ENABLED_ANSWER', 'yesno',.*'no')/'AUTO_KMODS_ENABLED_ANSWER', 'yesno', 'yes')/g" bin/vmware-config-tools.pl | grep -C 1 AUTO_KMODS_ENABLED_ANSWER

   $ans = get_persistent_answer($msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno',
                                'no');

Selbiges bei deiner verkürzten Version... Ob es einen Unterschied macht ob man die Zeilen hier kopiert oder direkt aus der Datei stammen?
 

Patschi

New Member
Bei einem anderen String-Tausch, in der selbigen Datei, scheint es aber zu funktionieren:
Code:
# ...do not install HGFS driver by default
sed -i "s/get_persistent_answer(\$hgfsQ, 'ENABLE_HGFS', 'yesno', \$defAns)/get_persistent_answer(\$hgfsQ, 'ENABLE_HGFS', 'yesno', 'no')/g" bin/vmware-config-tools.pl

Edit: AWK wäre vielleicht auch eine gute Alternative, aber habe damit leider zu wenig Erfahrung...
 
Last edited by a moderator:

Patschi

New Member
Okay, mach ich, danke nochmal!

Falls jemand Interesse am Script haben sollte:
Code:
#!/bin/bash
# Author: Patrik Kernstock (pkern.at)

# variables
FILE_PATH="/usr/sbin/PowerAppInstall/vmware/"
FILE_TARN="VMwareTools-*.tar.gz"
FILE=$(ls $FILE_PATH/$FILE_TARN | sort -n | head -1)
FILE_NAME=$(basename $FILE)
LOG_FILE="/var/log/vmwareTools-installation.log"

# starting...
echo "[*] Preparing installation..." | tee -a $LOG_FILE
echo ">>> Please do not abort or close the window." | tee -a $LOG_FILE
echo ">>> This may take some time..." | tee -a $LOG_FILE
sleep 3

echo

echo "[*] Extracting VMware tools '$FILE_NAME'..." | tee -a $LOG_FILE
sleep 1
tar -xzf $FILE -C /tmp/
if [ ${?} -ne 0 ]; then
    echo "[E] Extracting failed!" | tee -a $LOG_FILE
    exit 1
fi

sleep 1

echo "[*] Initiating automated VMware tools installation..." | tee -a $LOG_FILE
sleep 1
cd /tmp/vmware-tools-distrib/

echo "[*] Doing required VMware Tools modifications..." | tee -a $LOG_FILE
sleep 1
# hack some code to force some changes in the default answers of some installation questions
# ...do not install HGFS driver by default
sed -e "s/get_persistent_answer(\$hgfsQ, 'ENABLE_HGFS', 'yesno', \$defAns)/get_persistent_answer(\$hgfsQ, 'ENABLE_HGFS', 'yesno', 'no')/g" -i bin/vmware-config-tools.pl | tee -a $LOG_FILE | tee -a $LOG_FILE

# ...enable automatic kernel updates by default (NOT WORKING YET)
# whyever this does not work: sed -e "N;s/get_persistent_answer(\$msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno',.*'no')/get_persistent_answer(\$msg, 'AUTO_KMODS_ENABLED_ANSWER', 'yesno', 'yes')/g" -i bin/vmware-config-tools.pl
sed -e '1,/AUTO_KMODS_ENABLED_ANSWER/!{ /AUTO_KMODS_ENABLED/,/AUTO_KMODS_ENABLED_ANSWER/!s/no/yes/; }' -i bin/vmware-config-tools.pl | tee -a $LOG_FILE

# start installation (with overwritten default settings)
if [ -f "/etc/vmware-tools/locations" ]; then
	echo "[*] Writing VMware Tools configuration file..." | tee -a $LOG_FILE
	sleep 1
	perl bin/vmware-config-tools.pl --default --overwrite 2>&1 | tee -a $LOG_FILE
fi

echo "[*] Initiating VMware Tools installation..." | tee -a $LOG_FILE
sleep 1
perl vmware-install.pl --default 2>&1 | tee -a $LOG_FILE
INSTRET=${?}

echo "[*] Cleaning up... " | tee -a $LOG_FILE
rm /tmp/vmware-tools-distrib/ -Rfv >> $LOG_FILE
echo "[*] Cleaning up... Done." | tee -a $LOG_FILE

if [ $INSTRET -ne 0 ]; then
    echo "[E] Installation failed." | tee -a $LOG_FILE
    exit 1
fi

echo "[*] Installation done." | tee -a $LOG_FILE

exit 0

Aber da die VMware Tools sowieso legacy für Debian/Ubuntu sind, wird wohl demnächst der nächste Halt "open-vm-tools" sein...
 

Joe User

Zentrum der Macht
Syntaxfehler bei head und rm
Doppelter tee beim ersten sed
Es fehlen einige Quotes um Variablen
tee ist in dieser Verwendugsform generell überflüssig (unnötige Prozesslast), das lässt sich beim Sriptaufruf eleganter lösen.
 
Top