sed在不同的平台上返回不同的结果

您好在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>/' 。 但是,如果$testport * ,结果将取决于当前目录中存在的文件。

并不是所有的seds都支持像\s一样的reg-expression。 更便携的版本是

  test="port 3" echo "$test" | sed -r 's/[ ]*port[ ]*([0-9]+)[ ]*/<port>\1<\/port>/' 

如果你真的需要检查选项卡字符,只需将它们添加到char类(在所有3个地方),在我的示例中只包含空格字符,即[ ]位。

产量

 <port>3</port> 

我希望这有帮助。