Я читал некоторые другие вопросы по манипулированию строками bash, но они кажутся специализированными приложениями.
По сути, есть ли способ сделать ниже проще?
вместо
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
что-то вроде
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
Edit Я заинтересован в том, чтобы оставаться в рамках манипуляций с bash, если это возможно, чтобы поддерживать скорость (в отличие от 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/… вы можете сравнить его с ответом terdon на тот же вопрос, где он дает время для коротких строк, в которых процесс нереста занимает больше всего времени. Вы можете проверить это самостоятельно и опубликовать результат.
read x; echo $xлучше для производительности? Синтаксис не выглядит короче или чище. x=${x// /_}; x=${x^^}это гораздо более краткий способ сделать то же самое, что и {read x; echo ${x.... Что касается производительности, то @jimmij указал, что tr/ sedбудет быстрее, чем число bashразветвлений, равное. Использование канала всегда приводит к дополнительному процессу, поэтому аргумент сохранения разветвления больше не применяется. Таким образом, если вы используете каналы, просто используйте sed/ trи т.д. Если вы можете сделать это в bash, сделайте это и пропустите эту read x; echo $xерунду.