需要 sed 删除标点符号

需要 sed 删除标点符号

我有一个从 PHP 页面运行的 arp 扫描。它可以很好地发现我网络上的特定设备。唯一的问题是我必须更改 mac 信息以删除冒号,然后将所有字母默认为大写。

这是我的命令:

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

它仅检索以以下开头的 MAC 地址80:82:87

我发现一个 sed 命令可以将所有字母更改为大写,但在该命令中却没有。我怎样才能做到这一点?

答案1

tr非常适合这样的简单操作:

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

答案2

awk 可以进行模式匹配、大写一次性更换:

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

答案3

sed你可以这样做:

sed -n '/^80:82:87/ { s/;//g; y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/; p }'
  • -n选项告诉sed您不要打印其输入,除非明确指示这样做。
  • 表示大括号/^80:82:87/内的命令{…}只能在以 开头的行上执行80:82:87。这为您提供了与grep.您永远不需要通过管道grep输入sedor awk
  • s/;//g命令删除该行中的所有分号,这就是您所说的您想要的。如果您指的是冒号,则只需将其更改为s/://g
  • y命令将所有小写(罗马/ASCII)字母转换为大写。如果您只需要转换 MAC 地址(和/或其他十六进制值),则可以使用y/abcdef/ABCDEF/.
  • 最后,打印修改后的行。

@jasonwryan 促使我意识到,繁琐的命令可以用、  、 甚至y替换 ——但前提是您使用的是 GNU sed。  POSIX 中似乎没有定义。s/[[:lower:]]/\U&/gs/[[:alpha:]]/\U&/gs/.*/\U&/\U

答案4

我忽略了这样一个事实,即这可能最好在 PHP 中使用 PHP 的字符串操作函数(因为这就是您正在使用的内容)来完成,可能通过类似$addr = strtoupper(str_replace(":", "", $output)).相反,我将重点关注特定于 Unix 的 shell 解决方案。

使用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 地址的每个部分作为单独的记录(否则记录通常是一行输入),并在没有记录分隔符的情况下打印它们(否则输出记录分隔符默认为换行符)。在打印每条记录之前,它将其转换为大写。

相关内容