У меня есть этот код, но он не работает :
w(){
echo $(printf "%d" "'$1")
}
echo $(w "a")
t="abcd"
echo "$t" | sed "s/./(w &)/g"
echo "$t" | sed "s/./$(w &)/g"
Я получаю :
97
(w a)(w b)(w c)(w d)
0000
Я пробовал ставить ‘ или ” вокруг w или $(w &), как советует документация, но ничего не работает.
Что я упустил?
Вот простой while
цикл по символам, используя индексацию подстрок Bash:
w() { while [ "$1" ]; do printf '(w %d)' "'${1::1}"; set -- "${1:1}"; done; }
w abcd # (w 97)(w 98)(w 99)(w 100)
Хотя не уверен, является ли это форматом вывода, который вы ожидали.
Проще на Perl:
echo abcd | perl -lne 'print ord for split //'
Ответ
Если вы хотите заменить все символы строки на их ASCII-коды в Bash с использованием sed
, это может быть непростой задачей, поскольку sed
не поддерживает прямое вычисление ASCII-кодов. Однако это можно реализовать, используя комбинацию функций Bash и sed
. Ниже приведен рабочий пример:
- Используем функцию для получения ASCII-кода символа.
- Применяем
sed
с циклом для замены символов.
Вот пример скрипта, который делает это:
# Функция для получения ASCII-кода символа
ascii() {
printf "%d" "'$1"
}
# Исходная строка
t="abcd"
# Инициализация пустой строки для результата
result=""
# Цикл по каждому символу строки
for (( i=0; i<${#t}; i++ )); do
char=${t:i:1} # Получаем i-ый символ
ascii_code=$(ascii "$char") # Получаем ASCII-код символа
result+="($ascii_code)" # Добавляем в результат в нужном формате
done
# Выводим результат
echo "$result"
Объяснение:
-
Функция
ascii()
: Эта функция принимает символ как аргумент и выводит его ASCII-код с помощьюprintf
. -
Цикл: Мы проходим по каждому символу строки
t
. Для этого используется синтаксисfor (( i=0; i<${#t}; i++ ))
, который позволяет получить символы по индексам. -
Сбор результата: Каждый ASCII-код символа формируется в виде строки
($ascii_code)
и добавляется в переменнуюresult
. - Вывод: Наконец, мы выводим сформированную строку с ASCII-кодами.
Пример выполнения:
Если вы выполните этот скрипт, он выдаст:
(97)(98)(99)(100)
Вариант с использованием sed
Чтобы использовать sed
для преобразования строки, лучше использовать его в сочетании с echo
и циклами, как показано выше. Однако нет простого способа заменить символы на ASCII-коды напрямую через sed
без использования дополнительных команд. Поэтому использование Bash-скрипта с циклом — более подходящий способ для данной задачи.