Ich habe eine Eingabezeichenfolge wie:
arg1.arg2.arg3.arg4.arg5
Die Ausgabe, die ich möchte, ist:
arg5.arg4.arg3.arg2.arg1
Es sind nicht immer 5 Argumente, es können 2 bis 10 sein.
Wie kann ich das in einem Bash-Skript machen?
shell
text-processing
Jens
quelle
quelle
Wenn es Ihnen nichts ausmacht
python
:Beispiel:
s.split(".")
generiert eine Liste mit.
getrennten Teilzeichenfolgen,[::-1]
kehrt die Liste um und".".join()
verbindet die Komponenten der umgekehrten Liste mit.
.quelle
Sie können dies mit einem einzigen
sed
Aufruf tun :Dies verwendet den Haltepuffer, um eine führende neue Zeile im Musterraum zu erhalten, und verwendet ihn, um Permutationen durchzuführen, bis auf die neue Zeile kein Punkt mehr folgt. An diesem Punkt wird der führende Punkt aus dem Musterraum entfernt und die neue Zeile durch einen Punkt ersetzt.
Mit BRE und einem etwas anderen Regex:
Wenn die Eingabe aus mehr als einer Zeile besteht und Sie die Reihenfolge in jeder Zeile umkehren möchten:
quelle
SED-Lösung:
quelle
Mit
zsh
:So bewahren Sie leere Elemente auf:
s:.:
: aufgeteilt auf.
Oa
: Sort Array in umgekehrter ein rray indice o rderj:.:
: mach mit.
.@
: do-"$@"
like-Erweiterung in doppelten Anführungszeichen, damit die Erweiterung nicht entleert wird.Das POSIX (oder
bash
) Äquivalent könnte etwa so lauten:(Beachten Sie, dass
zsh
(in dersh
Emulation)yash
und einigepdksh
-basierte Shells in dieser Hinsicht keine POSIX-Shells sind, da sie$IFS
als Feldtrennzeichen anstelle eines Feldtrennzeichens behandelt werden. )Wo es sich von einigen anderen hier angegebenen Lösungen unterscheidet, ist, dass es das Newline-Zeichen (und im Falle des
zsh
NUL- Zeichens auch nicht) nicht speziell behandelt, das heißt, es$'ab.cd\nef.gh'
würde umgekehrt werden$'gh.cd\nef.ab'
, nicht$'cd.ab\ngh.ef'
oder$'gh.ef.cd.ab'
.quelle
IFS="."; set -f; set -- $string$IFS; for i; do rev="$i$IFS$rev"; done; printf '%s\n' "${rev%$IFS}"
?for i; do
davon, dass es sich (noch) nicht um POSIX handelt, selbst wenn es von allen mir bekannten POSIX-Shells unterstützt wird). Es ist nur so, dass diese Lösung eine direkte Übersetzung derzsh
einen Lösung ist (aufgeteilt in Array-, Reverse-Array- und Join-Array-Elemente), aber nur mit POSIX-Operatoren. (Ich habe die Einstellung auf geändertstring=$string$IFS; set -- $string
,set -- $string$IFS
da dies über alle Shells hinweg konsistent zu funktionieren scheint, danke).Ich sehe, Rahul hat (unter anderem) bereits eine native Bash-Lösung veröffentlicht, die eine kürzere Version der ersten ist, die ich mir ausgedacht habe:
Aber ich konnte nicht damit aufhören und hatte das Bedürfnis, eine rekursive bash-zentrierte Lösung zu schreiben:
quelle
Ich habe keine
awk
Antwort gefunden. Hier ist eine:quelle
Pure Bash, benötigt eine Nachlaufzeit bei der Eingabe:
Verwenden Sie
printf %s "$g"
diese Option, wenn eines der gepunkteten Elemente mit einem Bindestrich beginnen könnte.quelle