Требуется sed для удаления знаков препинания

У меня есть arp-scan, который я запускаю с PHP-страницы. Он обнаруживает определенные устройства в моей сети очень хорошо. Единственное, что я должен изменить информацию о маке, чтобы удалить двоеточия, а затем сделать все буквы по умолчанию закрытыми.

Вот моя команда:

$output = shell_exec("sudo arp-scan --interface=eth0 --localnet --numeric --quiet| grep -e 80:82:87"); 

Он получает только MAC-адреса, начинающиеся с 80:82:87

Я нашел команду sed для изменения всех букв в кепках, но не в этой команде. Как я могу это сделать?

4 Solutions collect form web for “Требуется sed для удаления знаков препинания”

Вы можете сделать это в sed так:

 sed -n '/^80:82:87/ { s/;//g; y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/; p }' 
  • Параметр -n указывает sed не печатать свой вход, кроме случаев, когда специально предназначено для этого.
  • В /^80:82:87/ говорится, что команды внутри скобок {…} должны выполняться только в строках, начинающихся с 80:82:87 . Это дает вам те же функции, что и grep . Вам не нужно будет тратить grep на sed или awk .
  • Команда s/;//g удаляет все точки с запятой в строке, это то, что вы сказали, что хотите. Если вы имели в виду двоеточие, просто измените его на s/://g .
  • Команда y преобразует все строчные (Roman / ASCII) буквы в верхний регистр. Если вам нужно только преобразовать MAC-адреса (и / или другие шестнадцатеричные значения), вы можете получить с помощью y/abcdef/ABCDEF/ .
  • Наконец, напечатайте измененную строку.

@jasonwryan подтолкнул меня к пониманию того, что громоздкую команду y можно заменить на s/[[:lower:]]/\U&/g , s/[[:alpha:]]/\U&/g или даже s/.*/\U&/ – но только если вы используете GNU sed. \U , похоже, не определен в POSIX.

tr идеально подходит для простых операций:

 echo '80:82:87:af:d2' | tr '[:lower:]' '[:upper:]' | tr -d ':' 

Awk может выполнить сопоставление шаблонов, верхний и нижний пределы за один проход:

awk '/^80:82:87/ {gsub(/:/,""); print toupper($0)}'

Я игнорирую тот факт, что это может быть лучше всего сделано в PHP (поскольку именно с этим вы работаете) с использованием функций манипуляции с PHP-функциями, возможно, через нечто вроде $addr = strtoupper(str_replace(":", "", $output)) . Вместо этого я сосредоточусь на решении оболочки Unix.

Использование Awk:

 awk 'BEGIN { RS=":"; ORS = "" } { print toupper }' <<<"$mac_address" 

Тестирование:

 $ mac_address="xx:yy:zz:k7:23:f0" $ awk 'BEGIN { RS=":"; ORS = "" } { print toupper }' <<<"$mac_address" XXYYZZK723F0 

Программа Awk будет считывать каждую часть MAC-адреса в виде отдельной записи (запись обычно является строкой ввода) и распечатывать их без разделителя записей (разделителем выходной записи по умолчанию является новая строка). Перед печатью каждой записи она преобразует ее в верхний регистр.

  • Я хотел бы стереть предыдущую точку нескольких строк текста
  • Удаление определенных символов из нескольких файлов с помощью белых кликов
  • Используйте sed, чтобы заменить строку текста новой строкой, включая переменную
  • Есть ли способ создать новый файл и вставить текст в этот файл с помощью bash?
  • Как удалить все строки, которые имеют одно значение в строке?
  • bash для замены коротких имен сервера в файле с помощью fqdn
  • Сопоставление и удаление строк с ~ 100 строк
  • как удалить строку из файла XML
  • Извлечение нескольких данных из столбца с помощью sed
  • Как вставить содержимое файла в другой файл перед шаблоном (маркером)?
  • Получение подстрок между разделителями несколько раз из одной строки без цикла
  • Linux и Unix - лучшая ОС в мире.