Я читав деякі інші питання з маніпулювання стрункою 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
дурницю.