MAC Adresse mit sed durch ein * ersetzen
Klara
- programmiertechnik
0 hotti0 Klara
0 Karla0 Candid Dauth0 Klara
Hi!
Warum funktioniert folgendes nicht?
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'
ich möchte eigentlich folgendes zurück bekommen
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="*", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
Klara
Hi!
Warum funktioniert folgendes nicht?
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'
Sicher, dass in der MAC-Addr Doppelpunkte sind?
Hotti
Hi!
Warum funktioniert folgendes nicht?
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'Sicher, dass in der MAC-Addr Doppelpunkte sind?
ja, das steht so in der Datei /etc/udev/rules.d/70-persistent-net.rules (OpenSUSE 11.1)
ifconfig gibt die Doppelpunkte auch aus
scar:~ # ifconfig
eth0 Link encap:Ethernet HWaddr 00:0d:34:26:ec:1e
inet addr:10.9.8.7 Bcast:10.9.8.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fec5:dc1a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1092 errors:0 dropped:0 overruns:0 frame:0
TX packets:482 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:182490 (178.2 Kb) TX bytes:89328 (87.2 Kb)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:326 errors:0 dropped:0 overruns:0 frame:0
TX packets:326 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:153681 (150.0 Kb) TX bytes:153681 (150.0 Kb)
Klara
Hi!
Warum funktioniert folgendes nicht?
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'ich möchte eigentlich folgendes zurück bekommen
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="*", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
warum wird beim zweiten Aufruf von sed die Ersetzung nicht durchgeführt?
susi:~ # cp -a /etc/udev/rules.d/{70-persistent-net.rules,70-persistent-net.rules.bak}
susi:~ # search=grep eth0 /etc/udev/rules.d/70-persistent-net.rules
susi:~ # replace=echo ${search} |sed -r 's/([0-9a-f]{2}:){5}[0-9a-f]{2}/\*/'
susi:~ # echo ${search}
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
susi:~ # echo ${replace}
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="*", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
susi:~ # sed -i "s/${search}/${replace}/g" /etc/udev/rules.d/70-persistent-net.rules
susi:~ # grep eth0 /etc/udev/rules.d/70-persistent-net.rules*
/etc/udev/rules.d/70-persistent-net.rules:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
/etc/udev/rules.d/70-persistent-net.rules.bak:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
Klara
Heißa, Karla,
susi:~ # sed -i "s/${search}/${replace}/g" /etc/udev/rules.d/70-persistent-net.rules
Sollte das nicht -e heißen? -i macht etwas ganz anderes, laut der Man-Page hier. Darüberhinaus dürfte es Probleme geben mit den geschweiften Klammern und Fragezeichen und so weiter in deinen beiden Strings, da diese ja in regulären Ausdrücken eine besondere Bedeutung haben.
Besser wär’s, die ganze Ersetzung in nur einem sed-Befehl durchzuführen, zum Beispiel, indem du ihn so erweiterst (ungetestet):
sed -r 's/([0-9a-f]{2}:){5}[0-9a-f]{2}(.*eth0)/*\2/'`
Dadurch werden nur noch Zeilen gematcht, in denen das eth0 weiter hinten steht, und die zweite Klammer wird mithilfe des \2 wieder an den Ersatzstring drangehängt, sodass sich dort nichts verändert.
Gautera!
Grüße aus Biberach Riss,
Candid Dauth
Heißa, Klara,
Warum funktioniert folgendes nicht?
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'
Weil das Anführungszeichen in deinem regulären Ausdruck das erste nimmt, was es findet (also das nach SUBSYSTEM=), denn alles bis zum ersten Doppelpunkt trifft ja auf die Beschreibung .* zu. Ebenso alles nach dem letzten Doppelpunkt bis zum letzten Anführungszeichen, auch das passt auf die Beschreibung .*. Die Lösung ist, die Beschreibung der einzelnen Teile der Mac-Adresse so weit zu spezialisieren, dass sie nur noch die tatsächliche Mac-Adresse matcht und nicht mehr den Rest, zum Beispiel, indem du das .* durch ein [0-9a-f]{2} ersetzt, oder was auch immer alles für Werte bei dir herauskommen können.
Gautera!
Grüße aus Biberach Riss,
Candid Dauth
Hallo
Warum funktioniert folgendes nicht?
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0d:34:26:ec:1e", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"' |sed 's/".*:.*:.*:.*:.*:.*"/bla/g'Weil das Anführungszeichen in deinem regulären Ausdruck das erste nimmt, was es findet (also das nach SUBSYSTEM=), denn alles bis zum ersten Doppelpunkt trifft ja auf die Beschreibung .* zu. Ebenso alles nach dem letzten Doppelpunkt bis zum letzten Anführungszeichen, auch das passt auf die Beschreibung .*. Die Lösung ist, die Beschreibung der einzelnen Teile der Mac-Adresse so weit zu spezialisieren, dass sie nur noch die tatsächliche Mac-Adresse matcht und nicht mehr den Rest, zum Beispiel, indem du das .* durch ein [0-9a-f]{2} ersetzt, oder was auch immer alles für Werte bei dir herauskommen können.
ok, das ist mir jetzt soweit Klar
warum funktioniert folgender Versuch nicht?
Klara