Нужен sed для удаления пунктуации

DSBL УДАЛСЯ DSBL УДАЛЕН и вряд ли вернется. Удалите его из конфигурации вашего почтового сервера.

1
21.01.2017, 10:48
4 ответа

Вы можете сделать это в 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 преобразует все строчные (латинские / ASCII) буквы в прописные. Если вам нужно только преобразовать MAC-адреса (и / или другие шестнадцатеричные значения), вы можете обойтись с помощью y / abcdef / ABCDEF / .
  • Наконец, выведите измененную строку.

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

1
27.01.2020, 23:14

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

echo '80:82:87:af:d2' | tr '[:lower:]' '[:upper:]' | tr -d ':'
3
27.01.2020, 23:14

Я игнорирую тот факт, что это может быть лучше сделано в 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-адреса как отдельную запись (в противном случае запись обычно представляет собой строку ввода) и распечатывает их без разделителя записей ( в противном случае разделителем выходной записи по умолчанию является новая строка). Перед печатью каждой записи он преобразует ее в верхний регистр.

0
27.01.2020, 23:14

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

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

2
27.01.2020, 23:14

Теги

Похожие вопросы