Вопрос или проблема
В моем файле есть:
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
на вашем исходном файле, вы можете сделать следующее:
- Создайте ваш файл. Например, назовем его
net_devices.txt
.
echo -e "eno1/tg3\neno2/tg3\neno3/tg3\neno4/tg3" > net_devices.txt
- Затем выполните команду
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
может быть простой и эффективной, если правильно формировать команды. Убедитесь, что каждая команда корректно настроена, и старайтесь избегать избыточной сложности, используя цикл вместо многоуровневых команд. Надеюсь, эта информация была полезной, и теперь вы сможете заменить символы в своих данных без трудностей.