" -- " mit Leerzeichen davor und dahinter.
Einfaches Beispiel:
Code: Alles auswählen
$ echo "aaa -- bbb -- ccc" | sed -e magie
bbb -- ccc
Code: Alles auswählen
$ echo "aaa --xy -- --bbb bla -- --ccc zw" | sed -e magie
--bbb bla -- --ccc zw
Code: Alles auswählen
$ echo "aaa -- bbb -- ccc" | sed -e magie
bbb -- ccc
Code: Alles auswählen
$ echo "aaa --xy -- --bbb bla -- --ccc zw" | sed -e magie
--bbb bla -- --ccc zw
Code: Alles auswählen
sed -r 's/.* -- (.*( --.*))/\1/'
Code: Alles auswählen
$ echo "aaa --xy -- --bbb bla -- --ccc zw" | grep -o ' -- .*' | sed s,....,,
--bbb bla -- --ccc zw
Code: Alles auswählen
$ echo "aaa --xy -- --bbb bla -- --ccc zw -- --ddd aaa" | sed 's/.* -- \(.*\( --.*\)\)/\1/'
--ccc zw -- --ddd aaa
$ echo "aaa --xy -- --bbb bla -- --ccc zw -- --ddd aaa" | grep -o ' -- .*' | sed s,....,,
--bbb bla -- --ccc zw -- --ddd aaa
Code: Alles auswählen
~$ variable="aaa --xy -- --bbb bla -- --ccc zw -- --ddd aaa"
~$ echo "${variable#* -- }"
--bbb bla -- --ccc zw -- --ddd aaa
Code: Alles auswählen
${parameter#word}
${parameter##word}
Remove matching prefix pattern. The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches the beginning of the value of parameter, then the result of the expansion is the expanded
value of parameter with the shortest matching pattern (the ``#'' case) or the longest matching pattern (the ``##'' case) deleted. If parameter is @ or *, the pattern removal operation is applied to each positional
parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and the expansion is
the resultant list.
Schoene Idee!RobertDebiannutzer hat geschrieben:03.08.2018 07:53:22Mit der bash in stretch würde auch sowas gehen:Code: Alles auswählen
~$ variable="aaa --xy -- --bbb bla -- --ccc zw -- --ddd aaa" ~$ echo "${variable#* -- }" --bbb bla -- --ccc zw -- --ddd aaa
Code: Alles auswählen
$ sh -c 'echo "${0#* -- }"' "aaa --xy -- --bbb bla -- --ccc zw -- --ddd aaa"
--bbb bla -- --ccc zw -- --ddd aaa
Ja, da bin ich über den ersten gierigen Quantor gestolpert!? In Ermangelung an einer nichtgierigen Auswertung oder einer negierten Mehrzeichen-Zeichenklasse muss also Eindeutigkeit her:Meillo hat geschrieben:03.08.2018 06:48:10Im Gegensatz zu tobos Variante funktioniert die auch mit weiteren `` -- '' im String korrekt:
Code: Alles auswählen
sed 's/ -- /XXX/;s/.*XXX//'
Code: Alles auswählen
sed 'ta;s/ -- /\n/;D;:a'
Gut beobachtet!Meillo hat geschrieben:03.08.2018 06:48:10Im Gegensatz zu tobos Variante funktioniert die auch mit weiteren `` -- '' im String korrekt:
Code: Alles auswählen
sh -c 'echo "${0#* -- }"' "aaa -- bbb -- ccc -- ddd"
Auch sehr schön, und mir verständlich. Könnte nur schiefgehen, wenn XXX im String auftaucht, z.B. im Pfad zu einem *hust* Bilderordner. XXX müßte also durch etwas eindeutigeres ersetzt werden.
äh? (Ich fühle mich geehrt, derart intelligente Antworten zu bekommen ... )tobo hat geschrieben:03.08.2018 13:46:14Ja, da bin ich über den ersten gierigen Quantor gestolpert!? In Ermangelung an einer nichtgierigen Auswertung oder einer negierten Mehrzeichen-Zeichenklasse muss also Eindeutigkeit her:
[...]Code: Alles auswählen
sed 'ta;s/ -- /\n/;D;:a'
Das könnte man ja beliebig eindeutig gestalten und eigentlich dachte ich, dass es das auch wäre. Aber ok, auf das gehustete Beispiel bin ich jetzt nicht gekommen und das ist auch ein Gegenargument.MartinV hat geschrieben:04.08.2018 15:37:37Auch sehr schön, und mir verständlich. Könnte nur schiefgehen, wenn XXX im String auftaucht, z.B. im Pfad zu einem *hust* Bilderordner. XXX müßte also durch etwas eindeutigeres ersetzt werden.
Das Problem anMartinV hat geschrieben:äh?tobo hat geschrieben:03.08.2018 13:46:14Ja, da bin ich über den ersten gierigen Quantor gestolpert!? In Ermangelung an einer nichtgierigen Auswertung oder einer negierten Mehrzeichen-Zeichenklasse muss also Eindeutigkeit her:
[...]Code: Alles auswählen
sed 'ta;s/ -- /\n/;D;:a'
Code: Alles auswählen
sed -r 's/.* -- (.*( --.*))/\1/'
Code: Alles auswählen
sed 's/^[^X]*X//'
Code: Alles auswählen
sed 'ta;s/ -- /\n/;D;:a'
Ich kenne fuer diesen Fall diese Herangehensweise:tobo hat geschrieben:04.08.2018 17:36:34Das könnte man ja beliebig eindeutig gestalten und eigentlich dachte ich, dass es das auch wäre. Aber ok, auf das gehustete Beispiel bin ich jetzt nicht gekommen und das ist auch ein Gegenargument.MartinV hat geschrieben:04.08.2018 15:37:37Auch sehr schön, und mir verständlich. Könnte nur schiefgehen, wenn XXX im String auftaucht, z.B. im Pfad zu einem *hust* Bilderordner. XXX müßte also durch etwas eindeutigeres ersetzt werden.
Code: Alles auswählen
a="`echo a | tr a \\01`"
sed "s/ -- /$a/;s/.*$a//"
Auf sowas bin ich jetzt nicht gekommen, aber eigentlich ist ein nicht darstellbares Zeichen natürlich logisch!? Könnte man vielleicht abkürzen:Meillo hat geschrieben:06.08.2018 09:49:50Ich kenne fuer diesen Fall diese Herangehensweise:Code: Alles auswählen
a="`echo a | tr a \\01`" sed "s/ -- /$a/;s/.*$a//"
Code: Alles auswählen
a=`printf '\1'`
Code: Alles auswählen
sed "s/ -- /\x1/;s/.*\x1//"
Code: Alles auswählen
sed "s/ -- /`printf '\1'`/;s/.*`printf '\1'`//"
echo "aaa -- bbb -- ccc -- ddd" | sed "s/ -- /`printf '\1'`/;l"
echo "aaa -- bbb -- ccc -- ddd" | sed "s/ -- /`printf '\1'`/;s/.*`printf '\1'`//"