Я читал некоторые другие вопросы по манипулированию строками 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
ерунду.