Scripting Contest

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Scripting Contest

Beitrag von ThorstenS » 16.05.2018 13:56:25

Die asc Variante kam wohl neu mit stretch, deswegen sehe ich sie persönlich als zukunftsträchtiger an und nutze sie. Was aber von offz. dazu besprochen oder bekannt gemacht wurde, entzieht sich meiner Kenntnis. Ich bin auch nur durch Zufall in der FAI-ML darüber stolpert.

laut https://manpages.debian.org/stretch/apt ... .8.de.html
SUPPORTED KEYRING FILES

Alternatively, if all systems which should be using the created keyring have at least apt version >= 1.4 installed, you can use the ASCII armored format with the "asc" extension instead which can be created with gpg --armor --export.

Benutzeravatar
TRex
Moderator
Beiträge: 8038
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Scripting Contest

Beitrag von TRex » 21.05.2018 16:56:24

Ich hab wieder was neues (nix neues im Kontext Internet, hab ne Menge Lösungen gefunden):

Produziere ein Histogramm für die Größe des Inhalts eines Verzeichnisses.

Einschränkungen sind glaub nicht notwendig. Von meinem eigenen Use-Case könnte man drei Schwierigkeitsgrade ableiten: 1. nur Text und Zahlen, 2. grafisches Histogramm, 3. dynamische Granularität.

Disclaimer: ich war mit Variante 1 schon glücklich ;)
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 21.05.2018 19:09:07

@TRex: Interessante Aufgabe, kannst du die Ziele bitte etwas detaillierter formulieren. Was ist mir ``Text und Zahlen'' gemeint? ASCII-Grafik? Oder ist das schon ``grafisch''? Wie verhaelt sich deine Aufgabe zu du(1)? ncdu(1) wird wohl das was du dir wuenschst, fertig bieten. Sowas aehnliches also in selbstgemacht?
Use ed once in a while!

Benutzeravatar
TRex
Moderator
Beiträge: 8038
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Scripting Contest

Beitrag von TRex » 21.05.2018 19:29:13

Meillo hat geschrieben: ↑ zum Beitrag ↑
21.05.2018 19:09:07
kannst du die Ziele bitte etwas detaillierter formulieren
Du hast auf einer Achse die Größe einer Datei oder eines Verzeichnis, und auf der anderen, wie oft das vorkommt. Was du damit auf einen Blick erkennen kannst, ist die Verteilung verschiedener Dateigrößen. Mit ncdu geht das nicht besser als mit du und sort (aber damit kann man sich was scripten), außer die Menge an Dateien ist trivial überschaubar.

Erklärung: https://de.wikipedia.org/wiki/Histogramm
Beispiel: https://cloud.addictivetips.com/wp-cont ... togram.png

Mit Text und Zahlen war gemeint, die Balken (der Grafik oben) nicht grafisch darzustellen, sondern einfach eine nach den Bins sortierte Liste mit Zahlen auszugeben.

Edit: nachdem ich den Wiki-Artikel überflogen hab, fiel mir auf, dass 3. vermutlich nicht besonders sinnvoll ist. Aber das werden Bastler schon sehen :)
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 21.05.2018 21:20:53

Jetzt verstehe ich, danke.
Use ed once in a while!

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Scripting Contest

Beitrag von heinz » 21.05.2018 21:31:19

Code: Alles auswählen

du -aSd1 --block-size=1M|sort -n|cut -f1 -d'.'|uniq -c
So was in der Art?

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Scripting Contest

Beitrag von eggy » 21.05.2018 22:13:30

Wollen wir uns nochmal über die "Lösungen erst posten wenn Zeitpunkt x erreicht ist"-Regel verständigen? Ich geh grade von Sonntagabend (18:00?) aus, aber wie wärs wenn der Aufgabensteller das jeweils mit in die Aufgabe schreibt?

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Scripting Contest

Beitrag von heinz » 22.05.2018 01:10:23

Oh, Tschuldigung... :oops:

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 24.05.2018 10:47:00

Ich habe eine Loesung der Kategorie 2 in awk fertig. Diese werde ich ab Sonntag Abend posten.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 27.05.2018 19:54:28

Hier nun meine Loesung:

Code: Alles auswählen

#!/bin/sh
# Histogram of file sizes
# https://debianforum.de/forum/viewtopic.php?f=34&t=156724


du -s "$@" | awk '

function getpow(n) {
	i = 0
	while (2^i < n) {
		i++
	}
	return i
}

function stars(n) {
	s = ""
	while (n--) {
		s = s "*"
	}
	return s;
}

{
	e = getpow($1)
	if (e > maxe) {
		maxe = e
	}
	hist[e]++
}

END {
	for (i=0; i<=maxe; i++) {
		printf("< %10d KB: %s\n", (2^i), stars(hist[i]))
	}
}
'
Ich habe mich entschieden, beliebige Datei-/Verzeichnisargument zu erlauben. Der uebliche Aufruf wird wohl als `size-hist *' erfolgen, um die Dateien (und Unterverzeichnisse) des aktuellen Verzeichnisses analysieren zu lassen.

Mein Programm gibt Balken als ASCII-Grafik aus -- ein Stern entspricht einer Datei.

Ich die einzig sinnvolle generelle Klassenbildung fuer Datenmengen verwendet, naemlich Zweierpotenzen. Alle anderen haetten Know-How ueber die Dateien benoetigt, was vielleicht ja Sinn der Sache gewesen waere, aber die Sache natuerlich komplexer gemacht haette. Da habe ich mich drumrum gedrueckt. Optimal ist mein Ansatz nicht, aber er funktioniert wenigstens immer.


... und nun, da ich meine ``Pflicht'' erfuellt habe, bin ich auf eure viel kuerzeren und besseren Loesungen gespannt. ;-)
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Scripting Contest

Beitrag von eggy » 27.05.2018 20:57:33

Kürzer aber wahrscheinlich auch nicht besser:

Code: Alles auswählen

library(ggplot2)
data = file.info(list.files(path="/tmp",full.names=TRUE))[1]
ausgabe <- ggplot(data, aes(x = size))  + geom_histogram( bins = 10)
ausgabe
für hübsch hässlich bunt und mit Farbe siehts dann so aus

Code: Alles auswählen

library(ggplot2)
path = "/var/"
bins = 20 
data= file.info(list.files(path=path,full.names=TRUE))[1]
ausgabe <- ggplot(data, aes(x = size))  + geom_histogram( bins = bins,  colour = "blue", fill = "#56B4E9") + 
         scale_y_continuous(name = "ungefähr so viele") + 
         scale_x_continuous(name = "und vielleicht so gross") +
         theme(axis.line = element_line(size=1, colour = "black"),
               panel.grid.major = element_blank(),
               panel.grid.minor = element_blank(),
               panel.border = element_blank(),
               panel.background = element_blank(),
               plot.title=element_text(size = 20, family="humor sans"),
               text=element_text(size = 26, family="humor sans"),
               axis.text.x=element_text(colour="black", size = 12),
               axis.text.y=element_text(colour="black", size = 12)) +
        ggtitle(paste("Dateien wo rumliegen in " , path, sep="") ) +
        scale_fill_gradient("Count", low = "blue", high = "red")
ausgabe
edit: sollt man evtl dazuschreiben: das ist Code für R

Benutzeravatar
TRex
Moderator
Beiträge: 8038
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Scripting Contest

Beitrag von TRex » 27.05.2018 21:17:32

Der Vollständigkeit halber das, was ich als Lösung adoptiert habe:

leicht abgewandelt von https://superuser.com/questions/565443/ ... and-prompt

Code: Alles auswählen

du -bs ${1:-.}/*                                                         \
 | awk '{ n=int(log($1)/log(2));                                         \
          if (n<10) n=10;                                                \
          size[n]++ }                                                    \
      END { for (i in size) printf("%d %d\n", 2^i, size[i]) }'           \
 | sort -n                                                               \
 | awk 'function human(x) { x[1]/=1024;                                  \
                            if (x[1]>=1024) { x[2]++;                    \
                                              human(x) } }               \
        { a[1]=$1;                                                       \
          a[2]=0;                                                        \
          human(a);                                                      \
          printf("%3d%s: %6d\n", a[1],substr("kMGTEPYZ",a[2]+1,1),$2) }'
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 27.05.2018 22:17:39

Zu TRex' Loesung:

Da haette ich wohl besser in Mathe aufpassen muessen, dann haette ich naemlich gewusst, dass ich statt meinem getpow() auch diesen Ausdruck verwenden haette koennen: int(log(n)/log(2)) :roll:

Meine stars()-Funktion uebernimmt nur die Darstellung als Balken statt als Zahl, was die TRex'sche Loesung nicht macht.

Das zusaetzliche `sort -n' ist noetig, weil in awk Arrays immer assoziativ und damit ungeordnet sind. Um das zu vermeiden musste ich `maxe' einfuehren.

Btw: Die Formatierung von dem Code ist ja abgefahren ... Das sieht mir schon mehr nach Optik a la IOCCC denn nach Lesbarkeit aus. Aber der Code hat einiges Gute, das ich aufgreifen sollte.



@eggy: Clever, fuer diese Aufgabe R zu nehmen!
Use ed once in a while!

TomL

Re: Scripting Contest

Beitrag von TomL » 27.05.2018 22:37:46

Meillo hat geschrieben: ↑ zum Beitrag ↑
27.05.2018 22:17:39
Btw: Die Formatierung von dem Code ist ja abgefahren ...
Nicht nur das.. ich find das insgesamt total abgefahren .... und ich gestehe, dass das meine Fähigkeiten sowas überhaupt zu entwickeln ein wenig übersteigt. Allerdings lief es bei mir nicht und ich war mal neugierig auf die Ursache.

1. Problem:

Code: Alles auswählen

du -bs ${1:-.}/* 
du: Warnung: Zusammenfassen widerspricht --max-depth=1
„du --help“ liefert weitere Informationen.
2. Problem (Auszugsweise nur einige dieser "Fehler"):

Code: Alles auswählen

du -b --max-depth=0 ${1:-.}/*
du: Zugriff auf './proc/194/task/194/fd/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/task/194/fdinfo/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/fd/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/fdinfo/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
Mit dieser Anpassung liefs dann nach meiner Einschätzung ganz gut:

Code: Alles auswählen

du -b --max-depth=0 ${1:-.}/* 2> /dev/null                               \
 | awk '{ n=int(log($1)/log(2));                                         \
          if (n<10) n=10;                                                \
          size[n]++ }                                                    \
      END { for (i in size) printf("%d %d\n", 2^i, size[i]) }'           \
 | sort -n                                                               \
 | awk 'function human(x) { x[1]/=1024;                                  \
                            if (x[1]>=1024) { x[2]++;                    \
                                              human(x) } }               \
        { a[1]=$1;                                                       \
          a[2]=0;                                                        \
          human(a);                                                      \
          printf("%3d%s: %6d\n", a[1],substr("kMGTEPYZ",a[2]+1,1),$2) }'
Den Unterschied von -s und --max-depth=0 habe ich nicht verstanden.... :roll:

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 27.05.2018 22:39:34

Eigentlich darf man bei einem Histogramm doch keine leeren Klassen weglassen, oder? Das wuerde doch, zumindest in einer grafischen Darstellung, die Aussage verfaelschen. Wenn ich die Ausgabe der TRex'schen Superuser-Loesung mit meiner vergleiche, dann wird's in ersterer etwas schwierig eine grafische Darstellung einzubauen, weil die leeren Klassen fehlen. Die bekommt man nur wenn man explizit ``von aussen'' ueber das Array iteriert.


Mittels der Inspiration aus TRex' Code habe ich meine Loesung nochmal verbessert:

Code: Alles auswählen

#!/bin/sh
# Histogram of file sizes
# https://debianforum.de/forum/viewtopic.php?f=34&t=156724


du -s "$@" | awk '

function stars(n) {
	s = ""
	while (n--) {
		s = s "*"
	}
	return s;
}

function human(x) {
	u = 1
	while (x >= 1024) {
		x /= 1024;
		u++
	}
	return x substr("kMGTEPYZ", u, 1)
}

{
	e = int(log($1)/log(2)) + 1
	if (e > maxe) {
		maxe = e
	}
	hist[e]++
}

END {
	for (i=0; i<=maxe; i++) {
		printf("< %4s: %s\n", human(2^i), stars(hist[i]))
	}
}
'
Use ed once in a while!

Benutzeravatar
TRex
Moderator
Beiträge: 8038
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Scripting Contest

Beitrag von TRex » 27.05.2018 22:41:43

Meillo hat geschrieben: ↑ zum Beitrag ↑
27.05.2018 22:17:39
@eggy: Clever, fuer diese Aufgabe R zu nehmen!
Ich hab auch darüber nachgedacht, python mit numpy/matplotlib zu nehmen... aber ich finde Portabilität der Form "wenige Abhängigkeiten" ist viel wert. Aber ja, spezialisierte Tools machen die Lösung gleich dreimal verständlicher und man erfindet das Rad nicht neu.

Die Formatierung hätte ich selbst vermutlich nicht so angelegt - viel zu kompliziert/starr zum Bearbeiten. Aber zum Posen auf superuser/stackoverflow taugts :D

@meillo: gutes Auge auf den leeren Klassen!
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 27.05.2018 22:44:24

TomL hat geschrieben: ↑ zum Beitrag ↑
27.05.2018 22:37:46
Meillo hat geschrieben: ↑ zum Beitrag ↑
27.05.2018 22:17:39
Btw: Die Formatierung von dem Code ist ja abgefahren ...
Nicht nur das.. ich find das insgesamt total abgefahren ....
Wenn man awk-Code gewohnt ist, ist dieser ganz in Ordnung. ;-)
1. Problem:

Code: Alles auswählen

du -bs ${1:-.}/* 
du: Warnung: Zusammenfassen widerspricht --max-depth=1
„du --help“ liefert weitere Informationen.
Kann ich nicht nachvollziehen. Bei mir laeufts problemlos.
2. Problem (Auszugsweise nur einige dieser "Fehler"):

Code: Alles auswählen

du -b --max-depth=0 ${1:-.}/*
du: Zugriff auf './proc/194/task/194/fd/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/task/194/fdinfo/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/fd/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf './proc/194/fdinfo/3' nicht möglich: Datei oder Verzeichnis nicht gefunden
Da hast du das Script wohl im root-Verzeichnis gestartet. Derartige Meldungen sind normal wenn man auf Dateien unterhalb von /proc zugreift.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 27.05.2018 22:51:20

Mein Script verwendet nur `du -s'. Wenn man weiss, dass man ein GNU du hat, ist `du -sb' besser (liefert Bytes). Fuer POSIX-Konformitaet ist `du -sk' die beste Wahl (liefert Kilobytes).

Ganz interessant dazu der Rationale-Abschnitt der POSIX-Seite zu du(1): http://pubs.opengroup.org/onlinepubs/96 ... es/du.html
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 12.07.2018 22:16:41

Neue Aufgabe:

Implementiere ein Einfaerben der Matches fuer grep(1) (oder egrep(1)), ohne `--color' zu verwenden. Es geht also um irgendeine Art von Wrapper um grep(1), der die Treffer in der Ausgabe einfaerbt, so wie `grep --color' das tut.

Gesucht sind kreative Ansaetze. (Die Behandlung aller Randfaelle kann vernachlaessigt werden.)


Loesungen koennen ab kommendem Sonntag, 18:00 gepostet werden.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 15.07.2018 19:28:41

Hier meine Implementierung:

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" "$@" 
Die Idee ist, zweimal durch die Datei zu laufen. Beim ersten Mal mit `grep -on' nur die Matches mit Zeilennummer rauszuholen. Daraus baue ich dann mittels sed ein awk-Script. das beim zweiten Durchgang durch die Datei diese Matches einfaerbt. :-)

Robustheit ist was anderes, aber von der Herangehensweise finde ich die Aufgabe sehr spannend. Mal sehen, ob mir noch eine weitere Herangehensweise einfaellt ...

Die Terminalcolorescapes habe ich uebrigens von `grep --color' abgeschaut. Weiss jemand was das `\033[K' macht?


Die Idee dazu hatten ein Freund und ich neulich. Da dachte ich, dass sich das auch als Scripting-Contest-Aufgabe eignen wuerde. Nun bin ich auf weitere Loesungen, Ideen und Kommentare gespannt.
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Scripting Contest

Beitrag von eggy » 15.07.2018 20:35:04


tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Scripting Contest

Beitrag von tobo » 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]"}

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' "$@"

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 16.07.2018 09:48:53

tobo hat geschrieben: ↑ zum Beitrag ↑
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! :lol: Da war ich ja mal super erfolgreich im unnoetig kompliziert sein. Von hinten durch die Brust ins Auge. :facepalm:

Danke, dass du mich aus meiner Denkrinne geholt hast. :THX:


Diese Aktion habe ich ja mal sowas von in den Sand gesetzt! :mrgreen:
Use ed once in a while!

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Scripting Contest

Beitrag von tobo » 16.07.2018 19:21:45

Ich will ja nicht kleinlich sein, aber das stimmt immer noch nicht: Der Text wird am Anfang zu "eth0.1" ergänzt.
Die Rückgabe von egrep liefert:

Code: Alles auswählen

1:2.168
1:0.1
1:5.255
1:5.0
Und diese Rückgaben sind Strings, werden von AWK (bei der Suche) aber als RegEx behandelt, weswegen das "0.1" im Beispiel doppelt greift!? Das ist also ein grundsätzliches Problem. Ich habe mal ein bisschen probiert an \2 "zumzuquoten", mich dabei aber vom richtigen Ergebnis eher entfernt, weil ich von AWK halt schlicht keine Ahnung habe.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Scripting Contest

Beitrag von eggy » 19.07.2018 08:48:10

Ich sitz grad an nen SVG-Problemchen und wahrscheinlich gibts schon nen kleines Tool dafür (oder Inkscape kann das irgendwie) aber vielleicht hat der ein oder andere ja trotzdem Lust sich damit zu beschäftigen: Aus einer SVG-Datei sollen alle Shapes extrahiert werden, dabei soll pro Shape die Farbe und evtl ein Objektname ausgegeben werden, zu jedem Shape soll auch eine Liste der (absoluten) Koordinaten ausgegeben werden. Kurven sollen dabei in Linien umgewandelt werden.

Klingt erstmal einfach, interessant wirds dadurch, dass in so einem Pfad relative und absolute Koordinaten gemischt auftreten können, Bewegungen auf eine Achse eingeschränkt werden können, und am Ende nur die Punkte des Polygons ohne die Kontrollpunkte der Bezierkurven in der Liste erscheinen sollen.

https://www.w3schools.com/graphics/svg_path.asp

Beispieldatei: NoPaste-Eintrag40384

Wie üblich: Lösungen bitte erst ab Sonntag 18:00h posten

Antworten