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

时间:2012-05-02 16:43:39

标签: linux sed embedded embedded-linux

您好在x86机器上使用以下命令(使用/ bin / sh)返回:<port>3<port>

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

但在基于ARM的网络交换机的sh shell上运行相同的命令会返回字符串port 3

如何在我的x86机器上获得与开关相同的结果?对我来说,似乎数字没有被[0-9]捕获。

2 个答案:

答案 0 :(得分:4)

\s是标准sed行为的GNU sed扩展。 GNU sed是桌面/服务器Linux系统上的实现。大多数嵌入式Linux系统运行BusyBox,这是一套实用程序,占用空间明显更小,功能更少。

指定“任何空格字符”的标准方法是[:space:] character class。 BusyBox支持它(至少,大多数BusyBox安装都支持;大多数BusyBox功能都可以被剥离,以获得更低的占用空间。)

BusyBox也不支持-r选项,您需要使用basic regular expression。在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>/'。但是,如果$testport *,则结果将取决于当前目录中存在哪些文件。

答案 1 :(得分:3)

并非所有seds都像\s一样支持reg-expression简写。

是一个更便携的版本
  test="port 3"
  echo "$test" | sed -r 's/[ ]*port[ ]*([0-9]+)[ ]*/<port>\1<\/port>/'

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

<强>输出

<port>3</port>

我希望这会有所帮助。