您好在x86机器上使用以下命令(使用/ bin / sh)返回: <port>3<port>
test="port 3" echo $test | sed -r 's/\s*port\s*([0-9]+)\s*/<port>\1<\/port>/'
但在基于ARM的networking交换机的sh shell上运行相同的命令将返回stringport 3
。
我如何才能在交换机上得到相同的结果,因为我在我的x86机器上? 对我来说,好像数字不被[0-9]捕获。
\s
是标准sed行为的GNU sed扩展。 GNU sed是桌面/服务器Linux系统上的实现。 大多数嵌入式Linux系统都运行BusyBox ,这是一套实用程序,具有明显更小的占用面积和更少的功能。
指定“任何空格字符”的标准方式是[:space:]
字符类 。 它由BusyBox支持(至少,通过大多数BusyBox安装;大部分BusyBox功能可以被剥离,以占用更小的空间)。
BusyBox也不支持-r
选项,你需要使用一个基本的正则表达式 。 在BRE中, \(…\)
标记组,并且没有+
运算符,只有*
。
echo "$test" | sed 's/[[:space:]]*port[[:space:]]*\([0-9][0-9]*\)[[:space:]]*/<port>\1<\/port>/'
请注意,由于您没有在$test
附近引用任何引号,因此shell对变量的值执行了分词和通配符扩展。 也就是说,变量的值被视为由空格分隔的文件名列表,然后由单个空格连接。 所以,如果你省略引号,你不必担心不同类型的空白,你可以写echo $test | sed 's/ *port *([0-9][0-9]*) */<port>\1<\/port>/'
echo $test | sed 's/ *port *([0-9][0-9]*) */<port>\1<\/port>/'
。 但是,如果$test
是port *
,结果将取决于当前目录中存在的文件。
并不是所有的seds都支持像\s
一样的reg-expression。 更便携的版本是
test="port 3" echo "$test" | sed -r 's/[ ]*port[ ]*([0-9]+)[ ]*/<port>\1<\/port>/'
如果你真的需要检查选项卡字符,只需将它们添加到char类(在所有3个地方),在我的示例中只包含空格字符,即[ ]
位。
产量
<port>3</port>
我希望这有帮助。