Я хочу разбить 'hello'
на h e l l o
массив, используя только bash, я мог бы сделать это в sed с помощью, sed 's/./& /g'
но я хочу знать, как разбить строку на массив в Bash, когда я не знаю, что будет разделитель, или разделитель любой один символ Я не думаю, что смогу использовать ${i// /}
без какой-либо креативности, потому что разделитель неизвестен, и я не думаю, что выражение принимает регулярное выражение. Я пытался использовать BASH_REMATCH с [[string = ~ ([az].). *]], Но он не работает, как я ожидал. Как правильно использовать только bash для выполнения определенного string.split()
типа поведения? Причина в том, что я пытаюсь написать утилиту rev во всех bash:
while read data; do
word=($(echo $data|tr ' ' '_'|sed 's/./& /g'))
new=()
i=$((${#word[@]} - 1))
while [[ $i -ge 0 ]]; do
new+=(${word[$i]})
(( i-- ))
done
echo ${new[@]}|tr -d ' '|tr '_' ' '
done
Но я использовал tr и sed, я хочу знать, как правильно делать разбиение, и тогда я исправлю это, чтобы все было bash. Просто для удовольствия.
[[ $string =~ ${string//?/(.)} ]]
будет установлено поBASH_REMATCH[]
мере необходимости, см. мой ответ на вопрос, на который Питер Мортенсен ссылается для объяснения.Ответы:
Вывод:
или (пожалуйста, обратите внимание на комментарии)
Вывод:
источник
while read -N 1 c; do a+=("$c"); done <<< "$s"
.-N
Позволяет читать даже переводы строк, и кавычки("$c")
избежать расширения имени пути (и некоторые другие вопросы).while read -N 1 c; do a+=("$c"); done <<< "$s"x
и затем удалить последний символ новой строки и х добавляемые:unset a[${#a[@]}-1]; unset a[${#a[@]}-1]
.Чтобы разбить строку на массив символов с нулевым разделителем, вы можете:
С разделителем, отличным от нуля, вы можете:
источник
IFS
можно установить, то вы можете просто сделать:IFS=',' arr=($str)
.Просто для прикола (и других снарядов) другой вариант:
И проверить
распечатает
источник
Способ 1:
Один лайнер:
Расширенный код:
Способ 2:
Один лайнер:
Расширенный код:
Благодаря @cuonglm по его предложению.
По сути, вы можете использовать
$REPLY
переменную по умолчанию, гдеread
читает входные данные.источник
$REPLY
вместоchar
переменной.