Вот пример, когда я пытался сделать то же самое в Ubuntu 16.04 для USB-устройства -Ethernet:
anurag@anurag-ThinkPad-E470:~$ lsusb
Bus 002 Device 003: ID 0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet
Bus 002 Device 002: ID 0424:5744 Standard Microsystems Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 138a:0011 Validity Sensors, Inc. VFS5011 Fingerprint Reader
Мы хотим отвязать первое устройство. Вы можете увидеть экземпляр драйвера, созданный в sysfs и внутри драйвера, экземпляр адреса шины USB донгла Ethernet :
.anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers$ ls
ax88179_178a btusb hub r8188eu usb usbfs usbhid uvcvideo
anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers/ax88179_178a$ ls
2-2.2:1.0 bind module new_id remove_id uevent unbind
Если вы подключите другой ключ того же типа, вы увидите два устройства:
anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers/ax88179_178a$ ls
2-2.1:1.0 2-2.2:1.0 bind module new_id remove_id uevent unbind
В этот момент вы можете увидеть два сетевых устройства:
anurag@anurag-ThinkPad-E470:~$ ip link show
....
6: enx000ec6cd8d75: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
link/ether 00:0e:c6:cd:8d:75 brd ff:ff:ff:ff:ff:ff
7: enx000ec6cd8d90: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
link/ether 00:0e:c6:cd:8d:90 brd ff:ff:ff:ff:ff:ff
Можно так отвязать:
anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers/ax88179_178a$ sudo sh -c "echo 2-2.2:1.0 > unbind"
[sudo] password for anurag:
anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers/ax88179_178a$ ls
2-2.1:1.0 bind module new_id remove_id uevent unbind
И устройство больше не будет отображаться в списке интерфейсов:
anurag@anurag-ThinkPad-E470:~$ ip link show
....
6: enx000ec6cd8d75: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
link/ether 00:0e:c6:cd:8d:75 brd ff:ff:ff:ff:ff:ff
Обратите внимание, что просто выдача sudo echo 2-2.2:1.0 > unbind
не работает, потому что это повышает права доступа только для команды echo, а не для перенаправления. Следовательно, мы используем временно повышенную оболочку. Unbind доступен для записи только пользователю root.
Использование упрощенного регулярного выражения электронной почты для замены 6-го вхождения |
плюс необязательный адрес электронной почты на |
(, оставляя не -адреса электронной почты в 7-м поле без изменений):
sed 's/|\([^|@]\+@[^|@]\+\.[a-zA-Z]\{2,\}\)\?/|/6' file
s/
замена |
литерал соответствия|
\(
начать группу [^|@]\+
соответствует одному или нескольким не-|
и не-@
символам (всем символам до@
)@
буквальное соответствие@
[^|@]\+
то же, что и двумя строками выше \.
соответствует точке [a-zA-Z]\{2,\}
соответствует 2 или более буквам \)
конечная группа \?
соответствует нулю или одной группе /|/
заменить на|
6
соответствует 6-му вхождению шаблона (Сценарий отредактирован после того, как к вопросу были добавлены дополнительные требования.)
awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } { print }' file
Пояснение:
-F '|' -v OFS='|'
установить разделители полей ввода и вывода $7 ~ /@/
условие :столбец 7 содержит@
{ $7 = "" }
действие :установить столбец 7 в пустую строку { print }
безусловное действие :напечатать строку
Этот сценарий предполагает, что в столбце 7 все, что содержит @
, является адресом электронной почты и что нет никаких дополнительных данных, которые не являются частью адреса электронной почты.
Как указано в комментарии Валентина Байрами, вы можете опустить оператор print
и добавить другое правило, содержащее только 1
, которое является «всегда истинным» условием(1
)с неявным действием по умолчанию print
.
awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } 1' file
Примечание :В отличие от (отредактированного )примера вывода вопроса, скрипт не удаляет начальный пробел в последней строке образца ввода.