Shell Parameter Expension, geht das auch kürzer ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ren22

Shell Parameter Expension, geht das auch kürzer ?

Beitrag von ren22 » 01.01.2020 20:50:10

Hallo,

geht das auch kürzer um nur als Ausgabe "text" unter Bash zu bekommen?

Code: Alles auswählen

foo="123.text.456"

bar="${foo#*.}"
foba="${bar%.*}"

echo $foba
Ausgabe: text

Danke

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

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von Meillo » 01.01.2020 20:54:38

Ich vermute, du suchst einen Weg ohne sed, denn damit ginge es natuerlich so:

Code: Alles auswählen

foo="123.text.456"
foba=`echo $foo | sed 's/^[^.]*\.//;s/\.[^.]*$//'`
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von JTH » 01.01.2020 21:06:22

Soweit ich weiß gibt es keine Expansion, die Prefix und Suffix in einem Schritt strippt. Außer dass du natürlich – je nach Anwendung – die eine Zuweisung weglassen kannst:

Code: Alles auswählen

foo="123.text.456"
bar="${foo#*.}"
echo "${bar%.*}"

Ich würd hier allerdings auch immer sed vermeiden, wenn es nur um einzelne Variablen geht. Ist meist schneller.

Nachtrag: Alternativer Weg, abhängig von der Anwendung:

Code: Alles auswählen

foo="123.text.456"
echo "${foo//[[:digit:]\.]/}"
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von tobo » 01.01.2020 22:45:29

Ist der Trenner gleich, dann wäre cut naheliegend:

Code: Alles auswählen

cut -d. -f2 <<< $foo

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

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von Meillo » 01.01.2020 23:28:33

tobo hat geschrieben: ↑ zum Beitrag ↑
01.01.2020 22:45:29
Ist der Trenner gleich, dann wäre cut naheliegend:

Code: Alles auswählen

cut -d. -f2 <<< $foo
Gute Idee ... die allerdings dann scheitert, wenn in ``text'' Punkte enthalten sein duerfen. Das geht aber aus der Fragestellung nicht hervor.
Use ed once in a while!

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

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von tobo » 02.01.2020 11:42:07

Ja, bei einer variablen Anzahl an Trennern ist cut natürlich nicht so toll. Entweder kann dann die Quantifizierung des letzten Trenners von außen erfolgen

Code: Alles auswählen

cut -d. -f2-$(grep -o '\.' <<< $foo | wc -l) <<< $foo
oder man nimmt zweimal den ersten Trenner.

Code: Alles auswählen

cut -d. -f2- <<< $foo | rev | cut -d. -f2- | rev
Also, falls man dann immer noch auf cut bestehen will!?

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

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von Meillo » 02.01.2020 12:48:13

LOL! Hat mir viel Freude bereitet, deinen Post zu lesen. :THX:
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von JTH » 02.01.2020 13:11:08

Ich weise nochmal auf den Geschwindigkeitsunterschied hin ;) – falls man tatsächlich nur einzelne Variablen bearbeitet, nicht einen größeren Datenblock/Datei, das Ganze aber wiederholt:

Code: Alles auswählen

#!/bin/bash

N=10000

printf "# Parameter Expansion" >&2
time for ((i = 0; i != N; ++i)); do
	foo="123.text.456"
	foo="${foo#*.}"
	foo="${foo%.*}"
done

printf "\n# sed" >&2
time for ((i = 0; i != N; ++i)); do
	foo="123.text.456"
	foo="$(echo "$foo" | sed 's/^[^.]*\.//;s/\.[^.]*$//')"
done

printf "\n# cut" >&2
time for ((i = 0; i != N; ++i)); do
	foo="123.text.456"
	foo="$(cut -d. -f2 <<< "$foo")"
done

Code: Alles auswählen

# Parameter Expansion
real	0m0,075s
user	0m0,075s
sys	0m0,000s

# sed
real	0m13,126s
user	0m12,613s
sys	0m2,181s

# cut
real	0m11,001s
user	0m9,169s
sys	0m1,966s
Ist natürlich ein konstruiertes Beispiel.
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von Meillo » 02.01.2020 17:12:27

Das Grossartige an der heutigen Computerwelt ist fuer mich, dass es egal geworden ist, ob ich Builtins oder externe Befehle aufrufe. Ich kann in Shellscripten dutzende lange Pipelines bauen und alles ist dennoch schnell genug. Im Alltaeglichen muss ich weder Speicher noch Rechenzeit sparen. Das erlaubt es mir, mich ganz auf die Problemloesung und die Verstaendlichkeit des Codes zu konzentrieren. Darin sehe ich einen Luxus und eine Chance, die frueher teuer erkauft werden mussten, heute aber fast kostenlos sind.


Dennoch finde ich es durchaus wertvoll, sich hin und wieder mal klar zu machen, wie die Performance-Situation aussieht, weil das das Verstaendnis verbessert. Auf meine Praxis hat das aber in solchen Faellen wenig Auswirkung. Diesen Thread hat dein Beitrag aber bereichert.
Use ed once in a while!

debianoli
Beiträge: 4072
Registriert: 07.11.2007 13:58:49
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von debianoli » 02.01.2020 17:26:25

Was machen denn die in dem Cut-Beispiel? ich kenne bislang nur > und >>

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

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von Meillo » 02.01.2020 17:42:45

debianoli hat geschrieben: ↑ zum Beitrag ↑
02.01.2020 17:26:25
Was machen denn die in dem Cut-Beispiel? ich kenne bislang nur > und >>
Das ist eine Bash-Extension. Die folgenden drei Befehle sind (ungefaehr) gleich:

Code: Alles auswählen

cmd <<<foo

echo foo | cmd

cmd <<!
foo
!
Aus der Manpage der Bash:
Here Strings
A variant of here documents, the format is:

<<<word

The word is expanded and supplied to the command on its
standard input.
Use ed once in a while!

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

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von eggy » 02.01.2020 19:14:14

und wieder was gelernt :THX:

debianoli
Beiträge: 4072
Registriert: 07.11.2007 13:58:49
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell Parameter Expension, geht das auch kürzer ?

Beitrag von debianoli » 02.01.2020 19:20:06

Thx :THX:

Antworten