Regex sed解析

Regex sed解析,regex,sed,perl,Regex,Sed,Perl,我很难编写一行程序(并行sed命令)来解析以下字符串(可以在/proc/interrupts中看到) 字符串为: 69:0550 PCI-X以太网-1@XX 输出字符串应为: 69XX@eth-1 (如果颠倒顺序太复杂,甚至69 eth-1) 为了澄清,输入字符串格式为: %d:PCI-X以太网-%x@XX" 字符串PCI-X对我来说并不重要 eth-1可以是eth-2。。。eth-15 XX是我事先读过的字符串 请帮忙! 谢谢试试这个: echo '69: 0 0 55 0 PCI-X eth

我很难编写一行程序(并行sed命令)来解析以下字符串(可以在/proc/interrupts中看到) 字符串为:

69:0550 PCI-X以太网-1@XX

输出字符串应为:

69XX@eth-1
(如果颠倒顺序太复杂,甚至
69 eth-1

为了澄清,输入字符串格式为: %d:PCI-X以太网-%x@XX" 字符串PCI-X对我来说并不重要 eth-1可以是eth-2。。。eth-15 XX是我事先读过的字符串

请帮忙! 谢谢

试试这个:

echo '69: 0 0 55 0 PCI-X eth-1@XX'|sed 's/^\(..\).*X \(.*\)@\(.*\)$/\1 \3@\2/g'
$ sed -re 's/^([^:]+):.*(eth-[[:xdigit:]]+)@(.+)$/\1 \3@\2/' <<< "69: 0 0 55 0 PCI-X eth-1@XX"
69 XX@eth-1
试试这个:

echo '69: 0 0 55 0 PCI-X eth-1@XX'|sed 's/^\(..\).*X \(.*\)@\(.*\)$/\1 \3@\2/g'
$ sed -re 's/^([^:]+):.*(eth-[[:xdigit:]]+)@(.+)$/\1 \3@\2/' <<< "69: 0 0 55 0 PCI-X eth-1@XX"
69 XX@eth-1
$sed-re的/^([^::]+):.*(eth-[:xdigit:]+)@(.+)$/\1\3@\2/”文件:
代码:
或与:

输出: 解释
  • ^
    断言字符串开头的位置
  • 第一个捕获组(\d+)
  • \d+匹配一个数字(等于[0-9])
  • +
    量词-在一次和无限次之间进行匹配,尽可能多地匹配,根据需要返回(贪婪)
  • 匹配字符:字面上(区分大小写)
  • *?
    匹配任何字符(行终止符除外)
  • *?
    量词-在零次和无限次之间进行匹配,匹配次数尽可能少,根据需要进行扩展(惰性)
  • 第二捕获组(eth-\d+)
  • eth-
    匹配字符eth-字面意义(区分大小写)
  • \d+
    匹配一个数字(等于[0-9])
  • +
    量词-在一次和无限次之间进行匹配,尽可能多地匹配,根据需要返回(贪婪)
  • @
    逐字匹配字符@(区分大小写)
  • 第三捕获组(\w+)
  • \w+
    匹配任何单词字符(等于[a-zA-Z0-9])
  • +
    量词-在一次和无限次之间进行匹配,尽可能多地匹配,根据需要返回(贪婪)

从可以测试正则表达式的地方复制的说明可以使用以下模式:

^([0-9]+).*(eth-[0-9]+)@([A-Z]{2})
  • ^
    断言行的起始位置
  • ([0-9]+)
    捕获组1。匹配数字
  • *
    贪婪地匹配任何东西
  • (eth-[0-9]+)
    捕获第2组。匹配子字符串
    eth-
    ,后跟数字
  • @
    匹配
    @
  • ([A-Z]{2})
    捕获组3。匹配两个大写字母
替换为:

\1 \3@\2
正则表达式演示


sed演示版:

$ echo '69: 0 0 55 0 PCI-X eth-1@XX' | sed -E 's/^([0-9]+).*(eth-[0-9]+)@([A-Z]{2})/\1 \3@\2/g'

69 XX@eth-1
使用awk:

echo '69: 0 0 55 0 PCI-X eth-1@XX' | awk -F '[: @]' '{print $1,$NF "@" $(NF-1)}'
使用
、空格和
@
作为字段分隔符<代码>$NF
是最后一列

输出:

69 XX@eth-1 69XX@eth-1
您可以对
[0-9a-fA-F]
使用
[:xdigit:][/code>。谢谢!跟进问题。我可以从eth-X中减去1吗?(意思是,E-5将是同一个班轮上的EY-4。不,据我所知,你不能单独使用SED。你也需要使用AWK。如果你发现它有用,现在你有足够的声望,谢谢。请避免给我这个代码。“问题。显示您正在处理的脚本并说明问题所在。另请参见
echo '69: 0 0 55 0 PCI-X eth-1@XX' | awk -F '[: @]' '{print $1,$NF "@" $(NF-1)}'
69 XX@eth-1