Ich habe einige andere Fragen zur Manipulation von Piping-Bash-Strings gelesen, aber es scheint sich um spezielle Anwendungen zu handeln.
Gibt es im Wesentlichen eine Möglichkeit, das Folgende einfacher zu machen?
anstatt
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
etwas wie
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Bearbeiten Ich bin daran interessiert, wenn möglich innerhalb von Bash-Manipulationen zu bleiben, um die Geschwindigkeit aufrechtzuerhalten (im Gegensatz zu sed / awk, die dazu neigen, meine Skripte stark zu verlangsamen).
Edit2: @jimmij
Ich mag das zweite Beispiel und habe mich dazu gebracht, eine Funktion zu machen.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
Handbuch, dann ist das Gegenteil der Fall, da die Zeit des Laichens der Prozesse im Vergleich zur Zeit der Zeichenfolgenmanipulation vernachlässigbar istsed
undawk
sind engagiert. Wenn der String extrem lang ist, sagen wir das gesamte Bash-Handbuch, kann Bash aufgrund einiger interner Einschränkungen einfach ablehnen, ganz fortzufahren.sed
,awk
,tr
oder ähnliches. Schauen Sie sich die gena2x-Antwort an, die ich vor einiger Zeit bearbeitet habe, und fügen Sie genau diese Informationen hinzu: unix.stackexchange.com/questions/162221/… Sie können sie mit der Antwort von terdon auf dieselbe Frage vergleichen, bei der er Zeit für kurze Zeichenfolgen gibt, in denen Das Laichen von Fällen dauert am meisten. Sie können es selbst testen und das Ergebnis veröffentlichen.read x; echo $x
besser für die Leistung? Die Syntax sieht nicht kürzer oder sauberer aus.x=${x// /_}; x=${x^^}
ist ein viel prägnanterer Weg, um das Gleiche zu tun wie{read x; echo ${x...
. In Bezug auf die Leistung hat @jimmij darauf hingewiesen, dasstr
/sed
schneller wäre alsbash
, wenn die Anzahl der Gabeln gleich wäre. Die Verwendung eines Rohrs führt immer zu einem zusätzlichen Prozess, sodass das Argument des Speicherns einer Gabel nicht mehr gilt. Wenn Sie also Pipes verwenden, verwenden Sie einfachsed
/tr
etc. Wenn Sie dies in Bash tun können, tun Sie dies und überspringen Sie diesenread x; echo $x
Unsinn.Antworten:
Was Jimij gesagt hat. Sein letztes Beispiel ist das, was Sie dem am nächsten kommen können, was Sie in Ihrem Ausdruck versuchen.
Hier ist eine Variante zu diesem Thema:
Ich würde gerne verwenden
tr
, da es ziemlich schnell ist.Ich nehme an, es ist eine Schande, dass bash keine verschachtelte Parametererweiterung zulässt. OTOH, die Verwendung solcher verschachtelter Ausdrücke kann leicht zu Code führen, dessen Lesen schmerzhaft ist. Wenn Sie nicht wirklich brauchen, dass die Dinge so schnell wie möglich laufen, ist es besser, Code zu schreiben, der einfach zu lesen, zu verstehen und zu warten ist, als clever aussehenden Code, der eine PITA zum Debuggen ist. Und wenn Sie wirklich Dinge mit Höchstgeschwindigkeit erledigen müssen, sollten Sie kompilierten Code verwenden, kein Skript.
quelle
Sie können Parametererweiterungen nicht so übergeben. Wenn Sie sich auf die
x
Verwendung von$
Symbolen wie im"${x}"
Formular beziehen , muss es sich um einen echten Variablennamen handeln, nicht um eine Standardeingabe, zumindest nicht umbash
. In könnenzsh
Sie verschachtelte Parametersubstitutionen folgendermaßen durchführen:(Hinweis:
:u
ist fürzsh
das gleiche wie^^
fürbash
)Das Verschachteln in Bash ist nicht möglich, und ich denke, was Sie in Frage gestellt haben, ist das Beste, was man bekommen kann. Wenn Sie jedoch aus irgendeinem seltsamen Grund Pipes in die Gleichung einbeziehen müssen, sollten Sie Folgendes versuchen:
quelle
tr
/sed
schneller alsbash
bei der Zeichenfolgenverarbeitung ist und wie Sie Pipes verwenden, um Zeichenfolgen über Standard-E / A zu übergeben, sehe ich buchstäblich Nullpunkt für die Ausführung dieser Operationen in Bash im Gegensatz zutr
/sed
. Warum sollte man jemals| { read x; echo $x... }
im Gegensatz zu einem| sed
, der das Gleiche tut?echo
undread
sind bash Einbauten, so im Prinzip ein wenig schneller). Wie ich bereits in der Antwort geschrieben habe, sind progressive Parametermanipulationen, die OP in der Frage hat, meiner Meinung nach das Beste, was man für diese Aufgabe in Bash bekommen kann. Auf jeden Fall ist das Problem eher akademisch.