Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
linuxCowboy
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Beitrag
von linuxCowboy » 22.08.2015 00:16:03
Ich hätte gern ein
seq über Zahlen und Großbuchstaben.
z.B.:
Ich lege mal vor:
Code: Alles auswählen
# 0-9 A-Z
seqx ()
{
s=`echo {1..9}`
if [[ $1 =~ ^[1-9]$ ]]; then
s=`eval echo {1..$1}`
elif
[[ $1 =~ ^[A-Z]$ ]]; then
s="$s `eval echo {A..$1}`"
fi
echo $s
}
-der_linux_cowboy --- Besser werden! ... f*** w$$
-
tobo
- Beiträge: 2339
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 22.08.2015 02:45:43
Code: Alles auswählen
#!/bin/bash
a='1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
grep -Eo "1(.*${1:-0})?"<<<$a
-
linuxCowboy
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Beitrag
von linuxCowboy » 22.08.2015 10:22:50
tobo hat geschrieben:
Code: Alles auswählen
#!/bin/bash
a='1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
grep -Eo "1(.*${1:-0})?"<<<$a
Der ist gut!!
auch so:
Code: Alles auswählen
seqx ()
{
a=`echo {1..9} {A..Z}`
grep -Eo "1(.*${1-9})?" <<< $a
}
-der_linux_cowboy --- Besser werden! ... f*** w$$
-
tobo
- Beiträge: 2339
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 22.08.2015 12:42:18
linuxCowboy hat geschrieben:auch so:
Code: Alles auswählen
seqx ()
{
a=`echo {1..9} {A..Z}`
grep -Eo "1(.*${1-9})?" <<< $a
}
Unterscheidet sich aber dann bei Aufrufen wie:
seqx
seqx 0
seqx 42
seqx ö
Wobei mir dieses ${1-9} gar nichts sagt!?
-
newdeb
- Beiträge: 134
- Registriert: 03.02.2011 11:11:21
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Frankfurt
Beitrag
von newdeb » 22.08.2015 15:23:14
Code: Alles auswählen
CHAR='1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
LAST=${1-9}
[[ "$CHAR" == *$LAST* ]] && echo ${CHAR%$LAST*}$LAST
-
linuxCowboy
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Beitrag
von linuxCowboy » 22.08.2015 17:33:24
newdeb hat geschrieben:Code: Alles auswählen
CHAR='1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
LAST=${1-9}
[[ "$CHAR" == *$LAST* ]] && echo ${CHAR%$LAST*}$LAST
Sehr originell!
tobo hat geschrieben:Wobei mir dieses ${1-9} gar nichts sagt!?
Genau wie deins, nur für diesen Fall ein Zeichen weniger.
-der_linux_cowboy --- Besser werden! ... f*** w$$
-
tobo
- Beiträge: 2339
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 23.08.2015 03:07:56
linuxCowboy hat geschrieben:tobo hat geschrieben:Wobei mir dieses ${1-9} gar nichts sagt!?
Genau wie deins, nur für diesen Fall ein Zeichen weniger.
Aha. Die Syntax dazu war mir nicht geläufig und gedanklich habe ich es wohl nicht geschafft, die 9 als Default-Wert anzuerkennen!? Aber egal, Du musst ja selbst wissen, was Du da als Ausgabe haben willst. Soviel aber noch: Solche Sachen wie a-z und A-Z stehen immer in Abhängigkeit zur Sortierreihenfolge (LC_COLLATE) und je nachdem, was da für eine Locale eingestellt ist, kann A-C durchaus auch AaBbC ergeben. Das war z.B. unter Lenny mit der deutschen UTF8 noch so. Willst Du da auf Nummer sicher gehen, dann verwendest Du die hartkodierte POSIX-Variante [:UPPER:] oder fügst vor dem echo noch ein LC_COLLATE=POSIX ein.
-
Meillo
- Moderator
- Beiträge: 9235
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 23.08.2015 08:10:50
linuxCowboy hat geschrieben:tobo hat geschrieben:Wobei mir dieses ${1-9} gar nichts sagt!?
Genau wie deins, nur für diesen Fall ein Zeichen weniger.
Aus der Manpage sh(0p):
Code: Alles auswählen
${parameter:-word} Use Default Values. If parameter is
unset or null, the expansion of word
is substituted; otherwise, the value
of parameter is substituted.
[...]
In the parameter expansions shown previously, use of the
colon in the format results in a test for a parameter that
is unset or null; omission of the colon results in a test
for a parameter that is only unset.
Use ed once in a while!
-
linuxCowboy
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Beitrag
von linuxCowboy » 23.08.2015 11:33:12
...und schon wird ein
Einzeiler draus:
Code: Alles auswählen
seqx () { LC_ALL=C echo {1..9} {A..Z} | grep -Eo "1(.*${1-9})?";}
-der_linux_cowboy --- Besser werden! ... f*** w$$
-
tobo
- Beiträge: 2339
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 23.08.2015 13:47:07
Ich sehe gerade, dass mein grep da oben überhaupt nicht zu meinem Text passt!? Soll so sein:
-
linuxCowboy
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Beitrag
von linuxCowboy » 23.08.2015 20:49:06
Könnte
seq schon eingebaut haben:
Code: Alles auswählen
-A|--alnum-upper Alphanumerics: 0-9 A-Z
-a|--alnum-lower Alphanumerics: 0-9 a-z
... und wenn wir schon mal dabei sind:
ruler-to-seq
-der_linux_cowboy --- Besser werden! ... f*** w$$
-
linuxCowboy
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Beitrag
von linuxCowboy » 24.08.2015 15:44:47
linuxCowboy hat geschrieben:Könnte
seq schon eingebaut haben:
Code: Alles auswählen
-A|--alnum-upper Alphanumerics: 0-9 A-Z
-a|--alnum-lower Alphanumerics: 0-9 a-z
Hier ein Vorschlag:
Code: Alles auswählen
$ seq --help
Usage: seq [OPTION]... LAST
or: seq [OPTION]... FIRST LAST
or: seq [OPTION]... FIRST INCREMENT LAST
...
-s, --separator=STRING use STRING to separate numbers (default: \n)
-a, --alpha alphabetic: A-Z a-z
...
Kernroutine:
Code: Alles auswählen
if (alpha) {
unsigned char last = *argv[argc - 1];
if (! ((last >= 'A' && last <= 'Z') || (last >= 'a' && last <= 'z')))
error(EXIT_FAILURE, 0, _("ascii letter only!"));
int incr = n_args == 3 ? atoi(argv[argc - 2]) : 1;
if (! (incr && incr >= -25 && incr <= +25))
error(EXIT_FAILURE, 0, _("bad increment!"));
unsigned char first = n_args == 3 ? *argv[argc - 3] : n_args == 2 ? *argv[argc -2] : last <= 'Z' ? 'A' : 'a';
if (! ((first >= 'A' && first <= 'Z') || (first >= 'a' && first <= 'z')))
error(EXIT_FAILURE, 0, _("ascii letter only!"));
if (! ((first <= 'Z' && last <= 'Z') || (first >= 'a' && last >= 'a')))
error(EXIT_FAILURE, 0, _("bad range!"));
for (int i = first; incr > 0 && i <= last || incr < 0 && i >= last; i += incr) {
fputc(i, stdout);
fputs (separator, stdout);
}
fputs (terminator, stdout);
return EXIT_SUCCESS;
}
Syntax:
38746
Diff:
38747
Example:
Code: Alles auswählen
seq --separator ' ' 9 | tr '\n' ' '; seq --alpha --separator ' ' C
1 2 3 4 5 6 7 8 9 A B C
seq -s ' ' 9 | tr '\n' ' '; seq -a -s ' ' Z | tr -d '\n'; seq -a -s ' ' z
1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
seq -a x -5 c
x
s
n
i
d
Hack the
coreutils!
-der_linux_cowboy --- Besser werden! ... f*** w$$
-
linuxCowboy
- Beiträge: 287
- Registriert: 05.02.2013 19:47:41
Beitrag
von linuxCowboy » 03.09.2015 21:19:53
Schönheitskorrektur für:
Code: Alles auswählen
$ seq -a -s '_-_' Z
A_-_B_-_C_-_D_-_E_-_F_-_G_-_H_-_I_-_J_-_K_-_L_-_M_-_N_-_O_-_P_-_Q_-_R_-_S_-_T_-_U_-_V_-_W_-_X_-_Y_-_Z_-_
und
Code: Alles auswählen
$ seq -a -s '_-_' Z -2 A
Z_-_X_-_V_-_T_-_R_-_P_-_N_-_L_-_J_-_H_-_F_-_D_-_B_-_
Fix:
Code: Alles auswählen
for (int i = first; incr > 0 && i <= last || incr < 0 && i >= last; i += incr) {
i == first || fputs (separator, stdout);
fputc(i, stdout);
}
diff-file mit
ruler-patch (optimiert)
-der_linux_cowboy --- Besser werden! ... f*** w$$