Вопрос или проблема
В моем файле есть:
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/\// = /'
Как упомянуто в комментариях, в общем, было бы полезно изменить разделитель sed
при работе с наклонными чертами, чтобы избежать путаницы и сделать скрипты более читаемыми (разделитель определяется символом, который идет сразу после s
). Например:
sed 's@/@ = @'
Однако, разбор ls
никогда не является хорошим решением; кроме того, лично в этом случае я бы даже не стал изощряться с конвейером и просто воспользовался бы циклом1:
for l1 in /sys/class/net/*; do
l2="${l1}"/device/driver/module
[ -L "${l2}" ] || continue
mpath=$(readlink "${l2}")
printf '%s = %s\n' "${l1##*/}" "${mpath##*/}"
done
[ -L "${l2}" ] || continue
: пропускает интерфейсы, у которых нет загруженного модуля
% for l1 in /sys/class/net/*; do
l2="${l1}"/device/driver/module
[ -L "${l2}" ] || continue
mpath=$(readlink "${l2}")
printf '%s = %s\n' "${l1##*/}" "${mpath##*/}"
done
enp114s0 = igc
wlo1 = iwlwifi
1: realpath
раньше не поддерживался повсеместно. Я не работал на достаточном количестве различных систем, чтобы утверждать, что это больше не так (подозреваю, что это не так), поэтому я использовал readlink
здесь, однако если у вас есть realpath
, используйте его вместо этого.
С любым awk
:
$ awk 'BEGIN{FS="/";OFS=" = "}{$1=$1} 1' /tmp/f
eno1 = tg3
eno2 = tg3
eno3 = tg3
eno4 = tg3
Ответ или решение
Как заменить специальный символ "/" на другую строку с помощью sed
В ситуации, когда требуется заменить символ /
на другой символ или строку в текстовом файле, инструмент sed
будет отличным выбором. Давайте разберем, как это можно сделать в вашем случае.
Условия задачи
У вас есть файл, содержащий строки, такие как:
eno1/tg3
eno2/tg3
eno3/tg3
eno4/tg3
Вам необходимо заменить символ /
на =
или :
, чтобы получить следующий вывод:
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
Это произошло из-за неправильного синтаксиса в команде sed
. На самом деле, вам нужно написать:
sed 's/\// = /'
Однако, использование слешей (/
) в качестве разделителей в sed
может создать путаницу, так как вы обращаетесь к тому же символу. В таких случаях более удобным будет использование другого символа в качестве разделителя. Например, вы можете использовать @
:
sed 's@/@ = @'
Предложенное решение
Контекст, приведенный в вашем вопросе, говорит о том, что вы пытаетесь добиться результата, не полагаясь на команды вроде ls
, так как это может привести к ошибкам. Вместо этого рассмотрим более простой подход.
Если ваш текст находится в файле, вы можете использовать следующую команду sed
для замены полукосой черты:
sed 's@/@ = @' /tmp/f
Этот код прочитает файл /tmp/f
и заменит каждый символ /
на строку =
, выдавая желаемый результат.
Альтернативные методы
Использование awk
Вы также можете использовать awk
, который может быть более удобен в таких случаях:
awk 'BEGIN{FS="/";OFS=" = "} {$1=$1} 1' /tmp/f
Здесь:
FS="/"
устанавливаетField Separator
(разделитель полей) равным/
.OFS=" = "
устанавливаетOutput Field Separator
(разделитель выходных полей) равно=
.
Этот код разбивает каждую строку на части, используя /
как разделитель, и затем соединяет их с новым разделителем.
Заключение
Используя предложенные методы, вы сможете успешно заменить символ /
на =
или :
в ваших строках. sed
и awk
— это мощные инструменты для манипуляции текстом в Linux и, в данном случае, могут быть использованы в зависимости от ваших предпочтений и требований к читабельности кода. Важно помнить о выборе соответствующего разделителя в командах sed
, чтобы избежать путаницы в коде.