子串通过sed

时间:2016-07-08 11:04:16

标签: regex sed

我有两种消息:

  • Board2Port1TS239.124.3.20:3000

  • Board4UserTagZDF_pippo_MFPService8011

如果我收到消息1(它包含Port),则输出应为Board2Port1

如果我收到消息2(它不包含Port),则输出应为Board4

BoardPort的数字不固定。

/bin/echo "Board2Port1TS239.124.3.20:3000" | /bin/sed -e '/Port/ s/???/???/ ; /Port/! s/???/???/'

我无法找到解决方案......任何人都可以帮助我吗?感谢

非常感谢Novocaine的完美解决方案。

我还有另一个与前一个问题直接相关的问题:

通过shell解决方案没问题:

[root@test3 snmptt]# /bin/echo 'Board2Port1TS239.124.3.21:3000' | /bin/sed -r 's/^(Board.(Port.)*).*/\1/g'
Board2Port1

现在我必须在SNMPTT配置中使用此命令。它不起作用。 这是snmptt.debug报告

Done performing substitution on PREEXEC line: /bin/echo 'Board2Port1TS239.124.3.21:3000' | /bin/sed -r 's/^(Board.(Port.)*).*/\1/g'
PREEXEC command: /bin/echo 'Board2Port1TS239.124.3.21:3000' | /bin/sed -r 's/^(Board.(Port.)*).*/\1/g'
    command output: Board2Port1TS239.124.3.21:3000

配置文件命令是:

PREEXEC /bin/echo '$p2' | /bin/sed -r 's/^(Board.(Port.)*).*/\1/g'

输出" Board2Port1TS239.124.3.21:3000"等于输入($ p2)。我不会为什么这么做。

提前致谢

3 个答案:

答案 0 :(得分:1)

sed -r 's/^(Board.(Port.)*).*/\1/g' File

答案 1 :(得分:0)

假设您每次都收到一条消息:

sed '/:/{s/\([0-9]\)[^0-9].*:/\1/;q};s/\([0-9]\)[^0-9].*/\1/'

应该有效:

kent$  sed '/:/{s/\([0-9]\)[^0-9].*:/\1/;q};s/\([0-9]\)[^0-9].*/\1/' <<< "Board2Port1TS239.124.3.20:3000"                                                                   
Board23000

kent$  sed '/:/{s/\([0-9]\)[^0-9].*:/\1/;q};s/\([0-9]\)[^0-9].*/\1/' <<< "Board4whatever3000"             
Board4

答案 2 :(得分:0)

假设输入看起来真的像你的例子,PortUserTag是固定字符串:

sed -r '/Port/{s/TS.*//;n};s/UserTag.*//'