Необходимо заменить специальный символ “/” на другой символ.

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

В моем файле есть:

cat /tmp/f
eno1/tg3
eno2/tg3
eno3/tg3
eno4/tg3

Мне нужно использовать sed для замены / на = или :

eno1 = tg3
eno2 = tg3
eno3 = tg3
eno4 = tg3

Я пробовал:

ls -l /sys/class/net/*/device/driver/module |cut -d/ -f5,13 |sed 's/\/\ = /'

Но я получаю эту ошибку:

sed: -e expression #1, char 9: unterminated 's' command

И я не хочу использовать perl и т.д.

sed жалуется, потому что

sed 's/\/\ = /'

в этом выражении отсутствует разделитель между шаблоном и заменой – судя по ожидаемому результату, я предполагаю, что вы просто ошибочно набрали \ вместо /, и на самом деле вы имели в виду:

sed 's/\// = /'

Тем не менее разбор ls никогда не является решением, и лично в этом случае я бы не стал пытаться что-то усложнять с помощью канала, я бы просто использовал цикл1:

for l in /sys/class/net/*; do
    l1="${l}"/device/driver/module
    [ -L "${l1}" ] || continue
    mname=$(readlink "${l1}")
    printf '%s = %s\n' "${l##*/}" "${mname##*/}"
done
% for l in /sys/class/net/*; do
l1="${l}"/device/driver/module
[ -L "${l1}" ] || continue
mname=$(readlink "${l1}")
printf '%s = %s\n' "${l##*/}" "${mname##*/}"
done
enp114s0 = igc
wlo1 = iwlwifi

1: realpath раньше не поддерживался широко. Я не работал на достаточном количестве различных систем, чтобы утверждать, что это не так и сегодня (подозреваю, что это не так), поэтому я использовал readlink здесь, однако если у вас есть realpath, используйте его вместо этого.

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

Когда вам необходимо заменить специальный символ, например /, на другой символ (например, = или :), в ваших данных с использованием утилиты sed, важно правильно составить команду и учесть особенности работы с sed. Давайте подробно рассмотрим, как это сделать.

Проблема

Вы предоставили команду, которая вызывает ошибку:

sed 's/\/\ = /'

Ошибка sed: -e expression #1, char 9: unterminated 's' command возникает из-за неправильного синтаксиса. Ваша команда не содержит символа замены, и часть выражения, относящаяся к поиску, также неверно оформлена.

Правильная команда sed

Для замены символа / на = вы можете использовать следующую команду:

sed 's/\//=/g'

Если вы хотели бы заменить / на :, используйте:

sed 's/\//:/g'
  • s – команда замены.
  • \ – экранирующий символ, позволяющий использовать символ / в шаблоне.
  • g – флаг, означающий замену всех вхождений в строке.

Пример использования

Для использования sed на вашем исходном файле, вы можете сделать следующее:

  1. Создайте ваш файл. Например, назовем его net_devices.txt.
echo -e "eno1/tg3\neno2/tg3\neno3/tg3\neno4/tg3" > net_devices.txt
  1. Затем выполните команду sed, чтобы заменить символ /:
sed 's/\//=/g' net_devices.txt

Вывод будет следующим:

eno1=tg3
eno2=tg3
eno3=tg3
eno4=tg3

Альтернативный подход

Если вы используете команды ls, cut и sed в исходной команде, можно упростить задачу. Вместо того чтобы пытаться комбинировать несколько команд, стоит использовать цикл для обработки каждого элемента:

for l in /sys/class/net/*; do
    l1="${l}/device/driver/module"
    [ -L "${l1}" ] || continue
    mname=$(readlink "${l1}")
    printf '%s = %s\n' "${l##*/}" "${mname##*/}"
done

Этот цикл декомпозирует сложные команды и позволяет выполнять поиск и вывод значений без необходимости пытаться разбить строки через cut, что уменьшает вероятность ошибок.

Заключение

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

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

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