Как заменить все символы строки на их ASCII-коды в Bash с помощью sed?

Вопросы и ответы

У меня есть этот код, но он не работает :

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 //'
  • -n считывает ввод построчно и выполняет код для каждой строки;
  • -l удаляет символ новой строки из ввода и добавляет его в вывод;
  • split с пустым шаблоном разбивает строку на отдельные символы;
  • ord возвращает кодовую точку символа.

Ответ

Если вы хотите заменить все символы строки на их ASCII-коды в Bash с использованием sed, это может быть непростой задачей, поскольку sed не поддерживает прямое вычисление ASCII-кодов. Однако это можно реализовать, используя комбинацию функций Bash и sed. Ниже приведен рабочий пример:

  1. Используем функцию для получения ASCII-кода символа.
  2. Применяем 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"

Объяснение:

  1. Функция ascii(): Эта функция принимает символ как аргумент и выводит его ASCII-код с помощью printf.

  2. Цикл: Мы проходим по каждому символу строки t. Для этого используется синтаксис for (( i=0; i<${#t}; i++ )), который позволяет получить символы по индексам.

  3. Сбор результата: Каждый ASCII-код символа формируется в виде строки ($ascii_code) и добавляется в переменную result.

  4. Вывод: Наконец, мы выводим сформированную строку с ASCII-кодами.

Пример выполнения:

Если вы выполните этот скрипт, он выдаст:

(97)(98)(99)(100)

Вариант с использованием sed

Чтобы использовать sed для преобразования строки, лучше использовать его в сочетании с echo и циклами, как показано выше. Однако нет простого способа заменить символы на ASCII-коды напрямую через sed без использования дополнительных команд. Поэтому использование Bash-скрипта с циклом — более подходящий способ для данной задачи.

Оцените материал
Добавить комментарий

Капча загружается...