Я читав деякі інші питання з маніпулювання стрункою bash string, але вони здаються спеціалізованими програмами.
По суті, чи є спосіб зробити наступне простішим?
замість
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
щось на зразок
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Редагувати Мені цікаво залишатися в баш-маніпуляціях, якщо можливо, для підтримки швидкості (на відміну від sed / awk, які мають тенденцію сильно уповільнювати мої сценарії)
Edit2: @jimmij
Мені подобається другий приклад і привів мене до створення функції.
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
trпосібнику, то навпаки, тому що час нерестування процесів незначний порівняно з часом маніпуляції рядками, для якого sedі awkприсвячені. Якщо рядок надзвичайно довгий, скажімо, весь посібник з bash, тоді bash може просто відмовитись від продовження дії через деякі внутрішні обмеження.
sed, awk, trабо аналогічними. Подивіться на відповідь gena2x, яку я відредагував певний час тому, додавши саме цю інформацію: unix.stackexchange.com/questions/162221/… ви можете порівняти її з відповіддю тердона на те саме запитання, де він дає час на короткі рядки, в яких нерестовий процес не потребує більшої кількості часу. Ви можете перевірити його самостійно та опублікувати результат.
read x; echo $xефективність? Синтаксис не виглядає коротшим і чистішим. x=${x// /_}; x=${x^^}набагато більш стислий спосіб зробити те саме, що і {read x; echo ${x.... Що стосується продуктивності, @jimmij вказував, що tr/ sedбуло б швидше, ніж bashкількість вилок рівна. Використання труби завжди призводить до додаткового процесу, тому аргумент збереження виделки більше не застосовується. Таким чином, якщо ви використовуєте труби, просто використовуйте sed/ trі т. Д. Якщо ви можете це зробити в башті, зробіть це і пропустіть цю read x; echo $xдурницю.