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

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

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

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, чтобы избежать путаницы в коде.

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

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