rev |
line source |
meillo@6
|
1 Das Werkzeugkaestle, #1
|
meillo@0
|
2
|
meillo@6
|
3 cut - cut out selected fields of each line of a file
|
meillo@6
|
4 ----------------------------------------------------
|
meillo@6
|
5 markus schnalke <meillo@marmaro.de>
|
meillo@6
|
6 2015-05
|
meillo@0
|
7
|
meillo@0
|
8
|
meillo@1
|
9 Cut ist ein klassisches Programm im Unix-Werkzeugkasten.
|
meillo@0
|
10 In keinem ordentlichen Tutorial zur Shellprogrammierung darf
|
meillo@0
|
11 es fehlen. Es ist ein schoenes Anschauungs- und Beispielobjekt
|
meillo@4
|
12 fuer's Shellscripting. Hier will ich ein wenig hinter die
|
meillo@4
|
13 Fassade schauen.
|
meillo@0
|
14
|
meillo@0
|
15
|
meillo@4
|
16 Funktionsweise
|
meillo@4
|
17
|
meillo@4
|
18 Die Funktionsbasis von cut waren urspruenglich zwei Modi, die
|
meillo@4
|
19 spaeter um einen dritten erweitert wurden. Cut schneidet
|
meillo@4
|
20 entweder bestimmte Zeichen aus den Zeilen der Eingabe oder
|
meillo@0
|
21 bestimmte durch Trennzeichen definierte Felder.
|
meillo@0
|
22
|
meillo@4
|
23 Der Zeichenmodus ist geeignet um Ausschnitte aus
|
meillo@4
|
24 Festbreitenformaten zu extrahieren. So kann man damit
|
meillo@4
|
25 beispielsweise bestimmte Zugriffsrechte aus der Ausgabe von
|
meillo@4
|
26 `ls -l' ausschneiden. Hier die Rechte des Besitzers:
|
meillo@0
|
27
|
meillo@4
|
28 $ ls -l foo | cut -c 2-4
|
meillo@4
|
29 rw-
|
meillo@0
|
30
|
meillo@4
|
31 Oder die Schreibrechte des Besitzers, der Gruppe und der
|
meillo@4
|
32 Welt:
|
meillo@0
|
33
|
meillo@4
|
34 $ ls -l | cut -c 3,6,9
|
meillo@4
|
35 ww-
|
meillo@0
|
36
|
meillo@4
|
37 Mit cut lassen sich aber auch Strings kuerzen.
|
meillo@0
|
38
|
meillo@6
|
39 $ echo "$long" | cut -c -20
|
meillo@0
|
40
|
meillo@4
|
41 Dieser Befehl gibt die ersten maximal 20 Zeichen (jeder
|
meillo@4
|
42 Zeile) von `$long' aus.
|
meillo@0
|
43
|
meillo@4
|
44 Geht es aber nicht um die Darstellung von Zeichen, sondern um
|
meillo@4
|
45 ihre Speicherung, dann ist `-c' nicht unbedingt die passende
|
meillo@4
|
46 Option. Frueher, als US-ASCII als Zeichensatz und -kodierung
|
meillo@4
|
47 noch omnipraesent war, wurde jedes Zeichen mit genau einem
|
meillo@4
|
48 Byte gespeichert. Somit selektierte `cut -c' gleichermassen
|
meillo@4
|
49 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von
|
meillo@4
|
50 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von
|
meillo@4
|
51 dieser Annahme loesen. In diesem Zug bekam cut mit
|
meillo@4
|
52 POSIX.2-1992 die Option `-b'. Diese selektiert Bytes. Will man
|
meillo@4
|
53 also nur die ersten maximal 500 Bytes vor dem
|
meillo@0
|
54 Newline-Zeichen stehen haben (und den Rest stillschweigend
|
meillo@0
|
55 ignorieren), dann macht man das mit:
|
meillo@0
|
56
|
meillo@6
|
57 $ cut -b -500
|
meillo@0
|
58
|
meillo@4
|
59 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese
|
meillo@4
|
60 Funktion ist insbesondere fuer POSIX wichtig, da so sicher
|
meillo@4
|
61 gestellt werden kann, dass Textdateien keine beliebig
|
meillo@4
|
62 langen Zeilen haben.
|
meillo@4
|
63 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17
|
meillo@0
|
64
|
meillo@0
|
65 Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den
|
meillo@0
|
66 interessanteren Feld-Modus, den man mit `-f' einleitet. Mit ihm
|
meillo@4
|
67 koennen Felder ausgewaehlt werden. Das Trennzeichen (per
|
meillo@4
|
68 Default der Tab) kann mit `-d' geaendert werden.
|
meillo@0
|
69
|
meillo@0
|
70 Der typische Anwendungsfall fuer den Feld-Modus. Ist die
|
meillo@0
|
71 Extraktion von Information aus der passwd-Datei. So z.B. der
|
meillo@0
|
72 Username, die User-ID und das Homeverzeichnis:
|
meillo@0
|
73
|
meillo@6
|
74 $ cut -d: -f1,3,6 /etc/passwd
|
meillo@0
|
75
|
meillo@0
|
76 (Die Argumente fuer die Optionen koennen bei cut uebrigens
|
meillo@0
|
77 direkt angehaengt oder mit Whitespace abgetrennt folgen.)
|
meillo@0
|
78
|
meillo@0
|
79
|
meillo@4
|
80 Dieser Feld-Modus ist fuer einfache tabellarische Dateien,
|
meillo@4
|
81 wie eben die passwd, gut geeignet. Er kommt aber schnell an
|
meillo@0
|
82 seine Grenzen. Gerade der uebliche Fall, dass an Whitespace
|
meillo@0
|
83 in Felder geteilt werden soll, wird damit nicht abgedeckt.
|
meillo@0
|
84 Der Delimiter kann nur genau ein Zeichen sein. Es kann also
|
meillo@0
|
85 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden.
|
meillo@0
|
86 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander
|
meillo@4
|
87 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses
|
meillo@4
|
88 Verhalten widerspricht den Erwartungen fuer eine Datei mit
|
meillo@4
|
89 Whitespace-getrennten Feldern. (Manche Implementierungen von
|
meillo@4
|
90 cut, z.B. die von FreeBSD, haben deshalb Erweiterungen, die
|
meillo@4
|
91 das gewuenschte Verhalten fuer Whitespace-getrennte Felder
|
meillo@4
|
92 bieten.) Ansonsten, d.h. wenn man portabel bleiben will,
|
meillo@4
|
93 hilft awk.
|
meillo@0
|
94
|
meillo@4
|
95 Awk bietet noch eine weitere Funktion, die cut missen
|
meillo@4
|
96 laesst: Das Tauschen der Felder-Reihenfolge. Bei cut ist die
|
meillo@4
|
97 Reihenfolge der Feldauswahl irrelevant; ein Feld kann selbst
|
meillo@4
|
98 mehrfach angegeben werden. Der Aufruf von `cut -c 5-8,1,4-6'
|
meillo@4
|
99 gibt z.B. die Zeichen Nummer 1, 4, 5, 6, 7 und 8 aus. Die
|
meillo@4
|
100 Auswahl aehnelt damit der Mengenlehre in der Mathematik:
|
meillo@4
|
101 Jedes angegebene Feld soll in der Ergebnismenge sein. Die
|
meillo@4
|
102 Felder der Ergebnismenge werden dabei immer in der gleichen
|
meillo@4
|
103 Reihenfolge ausgegeben wie sie in der Eingabe waren.
|
meillo@0
|
104
|
meillo@0
|
105
|
meillo@7
|
106
|
meillo@7
|
107 cut(1) in Version 8 Unix
|
meillo@7
|
108 ``In data base parlance, it projects a relation.''
|
meillo@7
|
109
|
meillo@7
|
110 WP:
|
meillo@7
|
111 http://de.wikipedia.org/wiki/Projektion_(Informatik)#Projektion
|
meillo@7
|
112
|
meillo@7
|
113 Die Projektion entspricht der Projektionsabbildung aus der
|
meillo@7
|
114 Mengenlehre und kann auch Attributbeschränkung genannt
|
meillo@7
|
115 werden. Sie extrahiert einzelne Attribute aus der
|
meillo@7
|
116 ursprünglichen Attributmenge und ist somit als eine Art
|
meillo@7
|
117 Selektion auf Spaltenebene zu verstehen, das heißt, die
|
meillo@7
|
118 Projektion blendet Spalten aus.
|
meillo@7
|
119
|
meillo@7
|
120
|
meillo@7
|
121
|
meillo@7
|
122
|
meillo@0
|
123 Geschichtliches
|
meillo@0
|
124
|
meillo@4
|
125 Cut erblickte 1982 mit dem Release von UNIX System III das
|
meillo@4
|
126 Licht der oeffentlichen Welt. Wenn man die Quellen von System
|
meillo@4
|
127 III durchforstet, findet man die Quellcodedatei cut.c mit dem
|
meillo@4
|
128 Zeitstempel 1980-04-11.
|
meillo@1
|
129 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd
|
meillo@4
|
130 Das ist die aelteste Manifestation des Programms, die ich
|
meillo@4
|
131 aufstoebern konnte.
|
meillo@0
|
132
|
meillo@1
|
133 Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein
|
meillo@1
|
134 fruehester Fund ein cut.c mit dem Datum 1986-11-07 im Code der
|
meillo@6
|
135 Spezialversion 4.3BSD-UWisc,
|
meillo@6
|
136 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix
|
meillo@6
|
137 die im Januar 1987 veroeffentlicht wurde.
|
meillo@1
|
138 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut
|
meillo@4
|
139 Die Datei unterscheidet sich nur minimal von der aus System III.
|
meillo@4
|
140 Im bekannteren 4.3BSD-Tahoe (1988) taucht cut aber nicht auf.
|
meillo@4
|
141 Im darauf folgenden 4.3BSD-Reno (1990) gibt es wiederum ein
|
meillo@4
|
142 cut ... ein von Adam S. Moskowitz und Marciano Pitargue neu
|
meillo@4
|
143 implementiertes cut, das 1989 in BSD aufgenommen wurde.
|
meillo@1
|
144 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut
|
meillo@4
|
145 Seine Manpage
|
meillo@1
|
146 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1
|
meillo@4
|
147 erwaehnt bereits die erwartete Konformitaet mit POSIX.2.
|
meillo@4
|
148 Nun sollte man wissen, dass POSIX.2 erst im September
|
meillo@4
|
149 1992 veroeffentlicht wurde, gut zwei Jahren *nachdem* die
|
meillo@4
|
150 Manpage und das Programm geschrieben wurden. Dieses cut
|
meillo@4
|
151 wurde also anhand von Entwuerfen des Standards
|
meillo@4
|
152 implementiert. Zweieinhalb Jahre Arbeit war immerhin schon in
|
meillo@4
|
153 den Standardisierungsprozess geflossen; bis zur
|
meillo@4
|
154 Fertigstellung sollte es noch weitere zwei Jahre dauern.
|
meillo@0
|
155
|
meillo@1
|
156 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut
|
meillo@1
|
157 aus Sicht des urspruenglichen Unix zu den juengeren Tools.
|
meillo@1
|
158 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
|
meillo@4
|
159 so war Unix doch schon ueber zehn Jahre alt, als cut das
|
meillo@4
|
160 erste Mal auftauchte. Insbesondere gehoerte cut noch nicht
|
meillo@4
|
161 zu Version 7 Unix, das die Ausgangsbasis aller modernen
|
meillo@4
|
162 Unix-Systeme darstellt. Die weit komplexeren Programme sed
|
meillo@4
|
163 und awk waren dort schon vertreten. Man muss sich also
|
meillo@4
|
164 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es
|
meillo@4
|
165 schon zwei Programme gab, die die Aufgabe von cut bereits
|
meillo@4
|
166 abdeckten. Ein Argument fuer cut ist seine Kompaktheit und
|
meillo@4
|
167 die damit verbundene Geschwindigkeit gegenueber dem damals
|
meillo@4
|
168 traegen awk. Diese schlanke Gestalt ist es auch, die der Unix
|
meillo@4
|
169 Philosopie entspricht: Mache eine Aufgabe und die richtig!
|
meillo@4
|
170 So bewaehrte sich cut. Es wurde in andere Unix Varianten
|
meillo@4
|
171 uebernommen, standardisiert und ist heutzutage ueberall
|
meillo@1
|
172 anzutreffen.
|
meillo@1
|
173
|
meillo@5
|
174 Die urspruengliche Variante (ohne -b) taucht schon 1985 in
|
meillo@5
|
175 der System V Interface Definition, einer wichtigen formalen
|
meillo@5
|
176 Beschreibung von UNIX System V, und in allen relevanten
|
meillo@5
|
177 Standards seither auf. Mit POSIX.2 im Jahre 1992 wurde cut
|
meillo@5
|
178 zum ersten Mal in der heutigen Form (mit -b) standardisiert.
|
meillo@1
|
179
|
meillo@1
|
180
|
meillo@2
|
181 Beschreibungen
|
meillo@1
|
182
|
meillo@2
|
183 Interessant ist ein Vergleich der Kurzbeschreibungen von cut,
|
meillo@3
|
184 wie sie sich in der Titelzeile von Manpages oder manchmal auch
|
meillo@5
|
185 am Anfang der Quellcodedatei finden.
|
meillo@2
|
186
|
meillo@5
|
187 Die folgende Liste ist grob nach Zeit geordnet und nach
|
meillo@5
|
188 Abstammung gruppiert:
|
meillo@3
|
189
|
meillo@3
|
190
|
meillo@2
|
191 System III cut out selected fields of each line of a file
|
meillo@3
|
192 System III (src) cut and paste columns of a table (projection of a relation)
|
meillo@2
|
193 System V cut out selected fields of each line of a file
|
meillo@2
|
194 HP-UX cut out (extract) selected fields of each line of a file
|
meillo@2
|
195
|
meillo@3
|
196 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation)
|
meillo@2
|
197 4.3BSD-Reno select portions of each line of a file
|
meillo@2
|
198 NetBSD select portions of each line of a file
|
meillo@7
|
199 OpenBSD 4.6 select portions of each line of a file
|
meillo@2
|
200 FreeBSD 1.0 select portions of each line of a file
|
meillo@3
|
201 FreeBSD 7.0 cut out selected portions of each line of a file
|
meillo@2
|
202 SunOS 4.1.3 remove selected fields from each line of a file
|
meillo@2
|
203 SunOS 5.5.1 cut out selected fields of each line of a file
|
meillo@2
|
204
|
meillo@2
|
205 POSIX cut out selected fields of each line of a file
|
meillo@2
|
206
|
meillo@2
|
207 GNU coreutils remove sections from each line of files
|
meillo@2
|
208
|
meillo@2
|
209 Minix select out columns of a file
|
meillo@2
|
210
|
meillo@2
|
211 Version 8 Unix rearrange columns of data
|
meillo@2
|
212 ``Unix Reader'' rearrange columns of text
|
meillo@2
|
213
|
meillo@2
|
214
|
meillo@5
|
215 Die zwei mit ``(src)'' markierten Beschreibungen sind aus
|
meillo@5
|
216 dem Quellcode entnommen, und verdeutlichen den Codetransfer.
|
meillo@5
|
217 POSIX ist ein Set von Standards, keine Implementierung. Der
|
meillo@5
|
218 ``Unix Reader'' ist ein rueckblickendes Textdokument von
|
meillo@5
|
219 Doug McIlroy, das das Auftreten von Tools in der Geschichte
|
meillo@5
|
220 des Research Unix zum Thema hat. Alle uebrigen Beschreibungen
|
meillo@5
|
221 entstammen den Manpages.
|
meillo@5
|
222
|
meillo@5
|
223 Zumeist ist mit der Zeit die POSIX-Beschreibung uebernommen
|
meillo@5
|
224 worden, wie beispielsweise bei FreeBSD zu sehen.
|
meillo@5
|
225 [ https://svnweb.freebsd.org/base?view=revision&revision=167101
|
meillo@5
|
226
|
meillo@7
|
227 Interessant ist, dass die GNU coreutils seit Anbeginn vom
|
meillo@5
|
228 Entfernen von Teilen der Eingabe sprechen, wohingegen die
|
meillo@5
|
229 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die
|
meillo@5
|
230 Worte ``cut out'' sind vielleicht auch nicht klar genug.
|
meillo@5
|
231 HP-UX hat sie deshalb praezisiert.
|
meillo@5
|
232
|
meillo@5
|
233 Auch beim Begriff, was denn nun selektiert wird, ist man sich
|
meillo@5
|
234 uneins. Die einen reden von Feldern (POSIX), andere von
|
meillo@5
|
235 Abschnitten bzw. Teilen (BSD) und wieder andere von Spalten
|
meillo@5
|
236 (Research Unix). Ironischerweise leistet sich gerade Version
|
meillo@5
|
237 8 Unix, das eigentlich um eine sehr treffende Weltsicht
|
meillo@5
|
238 bemueht ist, mit ``rearrange columns of data'' die
|
meillo@5
|
239 unzutreffendste der Beschreibungen.
|
meillo@5
|
240
|
meillo@5
|
241
|
meillo@2
|
242
|
meillo@3
|
243 Codevergleich
|
meillo@2
|
244
|
meillo@7
|
245 Nun zum Blick auf den Code. Hier soll eine Auswahl an
|
meillo@7
|
246 Implementierungen etwas genauer betrachtet werden. Fuer einen
|
meillo@7
|
247 ersten Eindruck ist der Umfang des Quellcodes hilfreich.
|
meillo@7
|
248 Typischerweise steigt dieser ueber die Jahre an. Diese
|
meillo@7
|
249 Beobachtung kann hier in der Tendenz aber nicht in jedem Fall
|
meillo@7
|
250 bestaetigt werden. Die Unterstuetzung des Byte-Modus (-b)
|
meillo@7
|
251 erfordert zwangslaeufig mehr Code, deshalb ist zu erwarten,
|
meillo@7
|
252 dass
|
meillo@2
|
253
|
meillo@7
|
254 -b pseudo: openbsd, netbsd.2014, gnu*
|
meillo@7
|
255 -b real: freebsd.2014
|
meillo@2
|
256
|
meillo@7
|
257 :-& echo '123ä56' | cut -c -6 | od -c
|
meillo@7
|
258 0000000 1 2 3 303 244 5 \n
|
meillo@7
|
259 0000007
|
meillo@5
|
260
|
meillo@7
|
261 :-& echo '123ä56' | cut -b -6 | od -c
|
meillo@7
|
262 0000000 1 2 3 303 244 5 \n
|
meillo@7
|
263 0000007
|
meillo@7
|
264
|
meillo@7
|
265
|
meillo@7
|
266 $ wc -lc cut.c* | sort -n
|
meillo@6
|
267 123 2966 cut.c__system_iii.1980-04-11
|
meillo@6
|
268 125 3038 cut.c__4.3bsd-uwisc.1986-11-07
|
meillo@6
|
269 256 5715 cut.c__4.3bsd-reno.1990-06-25
|
meillo@6
|
270 270 6545 cut.c__netbsd.1993-03-21
|
meillo@7
|
271 290 6892 cut.c__openbsd.2008-06-27 *
|
meillo@6
|
272 296 6920 cut.c__freebsd.1994-05-27
|
meillo@6
|
273 306 7500 cut.c__netbsd.2014-02-03 *
|
meillo@6
|
274 479 10961 cut.c__freebsd.2012-11-24 *
|
meillo@6
|
275 586 14175 cut.c__gnu.1992-11-08 *
|
meillo@6
|
276 830 23167 cut.c__gnu.2015-05-01 *
|
meillo@6
|
277 3271 80987 total
|
meillo@6
|
278
|
meillo@7
|
279 $ c_count cut.c* | sort -n
|
meillo@6
|
280 Total:
|
meillo@6
|
281 116 cut.c__system_iii.1980-04-11
|
meillo@6
|
282 118 cut.c__4.3bsd-uwisc.1986-11-07
|
meillo@6
|
283 200 cut.c__4.3bsd-reno.1990-06-25
|
meillo@6
|
284 200 cut.c__netbsd.1993-03-21
|
meillo@7
|
285 218 cut.c__openbsd.2008-06-27 *
|
meillo@6
|
286 224 cut.c__freebsd.1994-05-27
|
meillo@6
|
287 232 cut.c__netbsd.2014-02-03 *
|
meillo@6
|
288 382 cut.c__gnu.1992-11-08 *
|
meillo@6
|
289 391 cut.c__freebsd.2012-11-24 *
|
meillo@6
|
290 588 cut.c__gnu.2015-05-01 *
|
meillo@6
|
291 2451
|
meillo@6
|
292
|
meillo@6
|
293 (* == version hat -b)
|
meillo@6
|
294
|
meillo@6
|
295
|
meillo@5
|
296
|
meillo@7
|
297 system_iii.1980-04-11 Release 1.5
|
meillo@5
|
298
|
meillo@7
|
299 SCCSIDs:
|
meillo@7
|
300
|
meillo@7
|
301 4.3bsd-uwisc.1986-11-07 "@(#)cut.c 1.3";
|
meillo@7
|
302 4.3bsd-reno.1990-06-25 "@(#)cut.c 5.3 (Berkeley) 6/24/90";
|
meillo@7
|
303 netbsd.1993-03-21 "@(#)cut.c 5.4 (Berkeley) 10/30/90";
|
meillo@7
|
304 freebsd.1994-05-27 "@(#)cut.c 8.1 (Berkeley) 6/6/93";
|
meillo@7
|
305
|
meillo@7
|
306 freebsd.2012-11-24 "@(#)cut.c 8.3 (Berkeley) 5/4/95";
|
meillo@7
|
307 netbsd.2014-02-03 "@(#)cut.c 8.3 (Berkeley) 5/4/95";
|
meillo@7
|
308
|
meillo@7
|
309 openbsd.2008-06-27 "@(#)cut.c 8.3 (Berkeley) 5/4/95";
|
meillo@7
|
310 "$OpenBSD: cut.c,v 1.13 2008/06/27 08:02:13 sobrado Exp $";
|
meillo@7
|
311
|
meillo@7
|
312 GNU
|
meillo@7
|
313 Copyright (C) 1997-2015 Free Software Foundation, Inc.
|
meillo@7
|
314 Copyright (C) 1984 David M. Ihnat
|
meillo@7
|
315 /* Written by David Ihnat. */
|
meillo@7
|
316
|
meillo@7
|
317 /* POSIX changes, bug fixes, long-named options, and cleanup
|
meillo@7
|
318 by David MacKenzie <djm@gnu.ai.mit.edu>.
|
meillo@7
|
319
|
meillo@7
|
320 Rewrite cut_fields and cut_bytes -- Jim Meyering. */
|
meillo@7
|
321
|
meillo@7
|
322 1992-11-08
|
meillo@7
|
323 Jim Meyering
|
meillo@7
|
324
|
meillo@7
|
325
|
meillo@7
|
326
|
meillo@6
|
327
|
meillo@6
|
328
|
meillo@6
|
329
|
meillo@6
|
330 Autoreninfo
|
meillo@6
|
331
|
meillo@6
|
332 Markus Schnalke interessiert sich fuer die Hintergruende
|
meillo@6
|
333 von Unix und seinen Werkzeugen. Fuer die Erarbeitung dieses
|
meillo@6
|
334 Textes wurde er regelrecht zum Historiker.
|
meillo@6
|
335
|
meillo@6
|
336
|
meillo@6
|
337 Lizenz
|
meillo@6
|
338 CC0 (und kann damit auch unter CC BY-SA 4.0 Unported
|
meillo@6
|
339 veroeffentlicht werden)
|