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
Danke
Code: Alles auswählen
foo="123.text.456"
bar="${foo#*.}"
foba="${bar%.*}"
echo $foba
Code: Alles auswählen
foo="123.text.456"
foba=`echo $foo | sed 's/^[^.]*\.//;s/\.[^.]*$//'`
Code: Alles auswählen
foo="123.text.456"
bar="${foo#*.}"
echo "${bar%.*}"
Code: Alles auswählen
foo="123.text.456"
echo "${foo//[[:digit:]\.]/}"
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.tobo hat geschrieben:01.01.2020 22:45:29Ist der Trenner gleich, dann wäre cut naheliegend:Code: Alles auswählen
cut -d. -f2 <<< $foo
Code: Alles auswählen
cut -d. -f2-$(grep -o '\.' <<< $foo | wc -l) <<< $foo
Code: Alles auswählen
cut -d. -f2- <<< $foo | rev | cut -d. -f2- | rev
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
Code: Alles auswählen
<<<
Das ist eine Bash-Extension. Die folgenden drei Befehle sind (ungefaehr) gleich:debianoli hat geschrieben:02.01.2020 17:26:25Was machen denn diein dem Cut-Beispiel? ich kenne bislang nur > und >>Code: Alles auswählen
<<<
Code: Alles auswählen
cmd <<<foo
echo foo | cmd
cmd <<!
foo
!
Here Strings
A variant of here documents, the format is:
<<<word
The word is expanded and supplied to the command on its
standard input.