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
trinstrukcji, to odwrotnie, ponieważ czas odradzania procesów jest pomijalny w porównaniu do czasu manipulacji łańcuchem, dla którego sedi awksą 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, trlub 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 $xjest 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/ sedbę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/ tritd. Jeśli możesz to zrobić w bash, zrób to i pomiń ten read x; echo $xnonsens.