Я читал некоторые другие вопросы по манипулированию строками 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
ерунду.Ответы:
Что сказал Джимми. Его последний пример - самое близкое, что вы можете получить к тому, что вы пытаетесь использовать в своем выражении.
Вот вариант на эту тему:
Я был бы склонен использовать
tr
, поскольку это довольно быстро.Полагаю, это позор, что bash не допускает расширения вложенных параметров; OTOH, использование таких вложенных выражений может легко привести к коду, который больно читать. Если вам не нужны вещи для максимально быстрой работы, лучше писать код, который легко читать, понимать и обслуживать, а не умно выглядящий код, который можно отладить с помощью PITA. И если вы действительно делаете нужны вещи , чтобы сделать на максимальной скорости вы должны использовать скомпилированный код, а не скрипт.
источник
Вы не можете передавать расширения параметров таким способом. Когда вы ссылаетесь на
x
использование$
символа как в"${x}"
форме, тогда это должно быть реальное имя переменной, а не стандартный ввод, по крайней мере, не вbash
. Вzsh
вы можете выполнять вложенные подстановки параметров следующим образом:(примечание:
:u
дляzsh
того же, что и^^
дляbash
)Вложение в bash невозможно, и я думаю, что то, что вы написали в вопросе, - лучшее, что можно получить, но если по какой-то странной причине вам нужно включить каналы в уравнение, то вы можете попробовать это:
источник
tr
/sed
быстрее, чемbash
при обработке строк, и о том, как вы используете каналы для передачи строк через стандартный ввод / вывод, я вижу буквально нулевую точку для выполнения этих операций в bash, в отличие отtr
/sed
. Почему человек| { read x; echo $x... }
в отличие от| sed
того, кто делает то же самое?echo
и другоеread
встроено в bash, поэтому в принципе немного быстрее). Как я уже писал в ответе, прогрессивные манипуляции с параметрами, которые имеет OP в этом вопросе, являются наилучшими, на мой взгляд, для этой задачи в bash. В любом случае проблема довольно академическая.