seq extended

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

seq extended

Beitrag von linuxCowboy » 22.08.2015 00:16:03

Ich hätte gern ein seq über Zahlen und Großbuchstaben.

z.B.:

Code: Alles auswählen

$ seqx C
1 2 3 4 5 6 7 8 9 A B C
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

Re: seq extended

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

Re: seq extended

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

Re: seq extended

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

Re: seq extended

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

Re: seq extended

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! :THX:
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

Re: seq extended

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.

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

Re: seq extended

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

Re: seq extended

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})?";}
:D
-der_linux_cowboy --- Besser werden! ... f*** w$$

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

Re: seq extended

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:

Code: Alles auswählen

grep -Eo "^.*${1:-0}"<<<$a

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: seq extended

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:

Code: Alles auswählen

-r|--ruler    Ruler (default: $COLUMN)
ruler-to-seq
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: seq extended

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: NoPaste-Eintrag38746

Diff: NoPaste-Eintrag38747

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! :P
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: seq extended

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)

Code: Alles auswählen

 $ seq -a -s '__' I 6 U
I__O__U
:mrgreen:
-der_linux_cowboy --- Besser werden! ... f*** w$$

Antworten