Нет sed, нет awk, все внутренние элементы bash.
Предполагая, что слова всегда разделяются пробелами (пробел и/или вкладки),
также при условии, что слова даются в качестве аргументов, и писать для Баш только:
#!/bin/bash
blank=$'[ \t]'
varname='A'
n=1
while IFS='' read -r -d '' -N 1 c ; do
if [[ $c =~ $blank ]]; then n=$((n+1)); continue; fi
eval ${varname}${n}'+=("'"$c"'")'
done <<<"[email protected]"
last=$(eval echo \${#${varname}${n}[@]}) ### Find last character index.
unset "${varname}${n}[$last-1]" ### Remove last (trailing) newline.
for ((j=1;j<=$n;j++)); do
k="A$j[@]"
printf '<%s> ' "${!k}"; echo
done
Это установит каждый массив A1 , A2, A3 и т. Д. ... буквам каждого слова.
Значение в конце первого цикла $n
- это количество обработанных слов. Печать может быть немного сложной, поэтому код доступа к каждой букве приведен выше.
Применяется к тексту образца:
$ script.sh AB DC
<A> <B>
<D> <C>
Скрипт устанавливает два (массив) вары A1
и A2
.
И каждая буква представляет собой один элемент массива: A1 [0] = A, A1 [1] = B и A2 [0] = C, A2 [1] = D.
Чтобы получить доступ к элементу массива, вам необходимо установить переменную ($k
).
Например, для echo
четвертой буквы (с 0) второго слова (1 на основе), вы должны сделать (которые могут быть изменены в случае необходимости):
k="A2[3]"; echo "${!k}" ### Indirect addressing.
Сценарий будет работать следующим образом:
$ script.sh ABCD efghi
<A> <B> <C> <D>
<e> <f> <g> <h> <i>
Предостережение: Персонажи будут разделены, даже если они указаны. Однако приведенные аргументы - это правильный способ использования этого сценария, чтобы избежать влияния метасимволов оболочки (|, &,;, (,), <,>, пробел, вкладка). Конечно, пространства (даже если повторяется) будет разделять слова, как это определено в переменной $blank
:
$ script.sh $'qwer;rttt fgf\ngfg'
<q> <w> <e> <r> <;> <r> <t> <t> <t>
<>
<>
<>
<f> <g> <f> <
> <g> <f> <g>
Как сценарий будет принимать и правильно обрабатывать embebed новой строки мы должны использовать: unset "${varname}${n}[$last-1]"
удалить последнюю косую «перевод строки» , Если это нежелательно, укажите строку.
безопасности Примечание: Eval не большая проблема здесь, как это только обработка один посимвольно. Было бы сложно создать атаку, основанную только на одном символе. Во всяком случае, обычное предупреждение действительно: всегда дезинфицируйте свой вход перед использованием этого скрипта. Кроме того, большинство (не цитируемых) метасимволов bash нарушают этот скрипт.
$ script.sh qwer(rttt fgfgfg
bash: syntax error near unexpected token `('
См. [Edit-help] (http://stackoverflow.com/editing-help). – Cyrus
После того, как вы прочитаете слово из списка слов через 'while read -r word; do ...; done
Возможно, вы должны принять один ответ: [Как работает прием ответа?] (http://meta.stackexchange.com/q/5234/300807) –