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 ist sed
und awk
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, dass tr
/ sed
schneller wäre als bash
, 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 einfach sed
/ tr
etc. Wenn Sie dies in Bash tun können, tun Sie dies und überspringen Sie diesen read x; echo $x
Unsinn.