Замена subString в массиве с помощью bash

Вопрос или проблема

Что у меня получилось:

array[0]="Programm is Running"
array[1]="programm is down"

Что я хочу:

array[0]="Programm is \e[0;32mRunning\e[0m"
array[1]="programm is \e[0;31mDown\e[0m"

Это сделает вещи немного более красочными (с помощью команды echo -e), по крайней мере, я на это надеюсь.
Я попытался заменить это на:

array[$i]=${array[$i]//"running"/"\e[0;32mrunning\e[0m"}
array[$i]=${array[$i]//"down"/"\e[0;31mdown\e[0m"}

Это не сработало. Сообщение об ошибке:

0403-011 Указанная замена недопустима для этой команды.

Почему это происходит? Что я должен сделать иначе?

кажется, у вас неверно указан регистр Running vs running, следующее решение работает у меня

    array[0]="Programm is running"
    array[1]="Programm is down"

            for i in 0 1; do
            array[$i]=${array[$i]//"running"https://superuser.com/"\e[0;32mrunning\e[0m"}
            array[$i]=${array[$i]//"down"https://superuser.com/"\e[0;31mdown\e[0m"}
    done
    echo ${array[0]}
    echo ${array[1]}

выдает

    Programm is \e[0;32mrunning\e[0m
    Programm is \e[0;31mdown\e[0m

с echo -e вместо просто echo, это выдает корректный цветной текст, однако, было бы проще просто исправить вручную, чем перерабатывать это каждый раз, когда она запускается.

Ответ или решение

Для замены подстроки в массиве с использованием bash необходимо учесть несколько важных моментов, чтобы избежать ошибок и добиться желаемого результата. Ваш текущий метод замены подстрок вызывает ошибку, поскольку не учитывает некоторые нюансы Bash синтаксиса и работы с регистром. Давайте подробно разберем, как можно исправить вашу ситуацию.

Проблема

Вы столкнулись с ошибкой при выполнении замены подстрок в элементах массива Bash. Существует несколько потенциальных причин, почему это могло произойти:

  1. Чувствительность к регистру: Ваша текущая замена не учитывает различия в регистре слов ("Running" vs "running"). Это важно для успешной подстановки.

  2. Невалидная подстановка: Синтаксис подстановки может быть нарушен, что приводит к ошибке.

  3. Кодировка символов: Специальные символы для цветного вывода должны быть корректно интерпретированы командой echo -e.

Решение

Давайте применим более правильный подход для реализации вашей задачи:

#!/bin/bash

# Инициализация массива
array[0]="Programm is running"
array[1]="Programm is down"

# Цикл для обработки каждого элемента массива
for i in "${!array[@]}"; do
    # Замена подстрок с учетом регистра
    array[$i]=${array[$i]//"running"/"\e[0;32mRunning\e[0m"}
    array[$i]=${array[$i]//"down"/"\e[0;31mDown\e[0m"}
done

# Вывод массива с использованием `echo -e` для отображения цветного текста
for element in "${array[@]}"; do
    echo -e "$element"
done

Объяснения

  1. Итерирование по массиву: Мы используем цикл по индексам массива ("${!array[@]}"), чтобы извлечь текущий индекс и правильно обновить его значение.

  2. Замена подстрок: Обратите внимание, что переменные записаны в правильном регистре ("Running" и "Down") для успешной подстановки.

  3. Форматированная печать: Использование echo -e позволяет интерпретировать последовательности символов для цветной печати.

Заключение

Такой подход позволяет корректно выполнять замену подстрок в элементах массива и гарантирует, что форматировка работает как ожидалось. Применяя этот метод, вы сможете добиться цветного отображения необходимого текста в терминале.

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

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