tobo hat geschrieben: 15.07.2018 22:25:35
Soll das denn so sein, dass die Ausgabe bei Mehrfachtreffern auch mehrfach geschieht? Wenn ich z.B. diese Zeile in einer Datei habe:
#ifconfig eth0 192.168.10.1 netmask 255.255.255.0 up>
und ich suche nach
"[0-9]\.[0-9]+"
dann bekomme ich 4 Ausgabezeilen, unterschiedlich eingefärbt UND textlich (eth0.) verändert!? {EDIT: Beschränkt sich offensichtlich auf "[0-9]"}
Du hast recht, das ist falsch. Es ist die Folge eines klassischen Problems bei der Softwareentwicklung. Ich habe die ganze Zeit mit diesem Code entwickelt und getestet:
Code: Alles auswählen
#!/bin/sh
re="$1"
shift
start="`printf '\033[31;01m\033[K'`"
end="`printf '\033[m\033[K'`"
cmd=`egrep -on "$re" "$@" | sort -u | sed '
s_\([0-9]*\):\(.*\)_NR==\1 {gsub("\2", "'"$start"'\2'"$end"'")}_
'`
awk "$cmd;1" "$@"
Erst ganz am Ende habe ich realisiert, dass ich nur die gematchten Zeilen ausgeben sollte (also auch greppe und nicht nur highlighte). Folglich habe ich das ``;1'' in der letzten Zeile entfernt und in der sed-Ersetzung ein ``;print'' eingefuegt:
Code: Alles auswählen
#!/bin/sh
re="$1"
shift
start="`printf '\033[31;01m\033[K'`"
end="`printf '\033[m\033[K'`"
cmd=`egrep -on "$re" "$@" | sort -u | sed '
s_\([0-9]*\):\(.*\)_NR==\1 {gsub("\2", "'"$start"'\2'"$end"'");print}_
'`
awk "$cmd" "$@"
... dachte mir, das wird schon passen.
Habe dann nur noch einen kleinen Test gemacht, der das Problem nicht gezeigt hat ...
Es ist ja nicht so, dass man dieses Problemszenario noch nie gesehen haette. Trotzdem faellt man drauf rein. Haette ich nur eine Testsuite geschrieben, die haette mich davor bewahrt! Also: Darum Testsuites schreiben! ... und auch laufen lassen!
Falls das jetzt lösungstechnisch nicht zwingend vorgeschrieben ist grep zu verwenden, um grep zu simulieren - sed kann ja auch direkt regex!? Nur umgeschrieben und "nicht" ausgiebig getestet:
Code: Alles auswählen
#!/bin/sh
re="$1"
shift
start="`printf '\033[31;01m'`"
end="`printf '\033[m'`"
sed -rn 's/'"$re"'/'"$start"'&'"$end"'/gp' "$@"
LOL!
Da war ich ja mal super erfolgreich im unnoetig kompliziert sein. Von hinten durch die Brust ins Auge.
Danke, dass du mich aus meiner Denkrinne geholt hast.
Diese Aktion habe ich ja mal sowas von in den Sand gesetzt!