Przeczytałem kilka innych pytań dotyczących manipulacji ciągami bashowymi, ale wydaje się, że są to wyspecjalizowane aplikacje.
Zasadniczo, czy jest sposób, aby zrobić poniższe prostsze?
zamiast
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
coś jak
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Edytuj Jestem zainteresowany utrzymywaniem manipulacji bash, jeśli to możliwe, aby utrzymać prędkość (w przeciwieństwie do sed / awk, które mają tendencję do znacznego spowalniania moich skryptów)
Edycja2: @jimmij
Podoba mi się drugi przykład i doprowadziłem mnie do stworzenia funkcji.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
tr
instrukcji, to odwrotnie, ponieważ czas odradzania procesów jest pomijalny w porównaniu do czasu manipulacji łańcuchem, dla którego sed
i awk
są oddani. Jeśli ciąg znaków jest bardzo długi, powiedzmy całą instrukcję bash, wtedy bash może po prostu odmówić kontynuowania, z powodu pewnych wewnętrznych ograniczeń.
sed
, awk
, tr
lub podobnych. Spójrz na odpowiedź gena2x, którą edytowałem jakiś czas temu, dodając dokładnie tę informację: unix.stackexchange.com/questions/162221/ ... możesz porównać ją z odpowiedzią Terdona na to samo pytanie, w którym daje on czas na krótkie łańcuchy, w których spawnowanie procesu zajmuje najwięcej czasu. Możesz to przetestować samodzielnie i opublikować wynik.
read x; echo $x
jest lepszy dla wydajności? Składnia nie wygląda na krótszą ani bardziej przejrzystą. x=${x// /_}; x=${x^^}
jest o wiele bardziej zwięzłym sposobem robienia tego samego {read x; echo ${x...
. Jeśli chodzi o wydajność, @jimmij wskazał, że tr
/ sed
będzie szybszy niż bash
, przy równej liczbie rozwidleń. Użycie rury zawsze powoduje dodatkowy proces, więc argument o zapisaniu widelca nie ma już zastosowania. Tak więc, jeśli używasz potoków, po prostu użyj sed
/ tr
itd. Jeśli możesz to zrobić w bash, zrób to i pomiń ten read x; echo $x
nonsens.