cho*_*hoc 5 linux embedded sed 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>/'
Run Code Online (Sandbox Code Playgroud)
但在基于ARM的网络交换机的sh shell上运行相同的命令会返回该字符串port 3.
如何在我的x86机器上获得与开关相同的结果?对我来说,似乎数字没有被[0-9]捕获.
\\s是标准 sed 行为的 GNU sed 扩展。GNU sed 是桌面/服务器 Linux 系统上的实现。大多数嵌入式 Linux 系统都运行BusyBox,这是一套占用空间明显较小且功能较少的实用程序。
指定 \xe2\x80\x9cany 空格字符\xe2\x80\x9d 的标准方法是[:space:] 字符类。它受 BusyBox 支持(至少大多数 BusyBox 安装都支持;大多数 BusyBox 功能都可以被剥离以减少占用空间)。
BusyBox也不支持该-r选项,您需要使用基本的正则表达式。在 BRE 中,\\(\xe2\x80\xa6\\)标记组,并且没有+运算符,只有*。
echo "$test" | sed \'s/[[:space:]]*port[[:space:]]*\\([0-9][0-9]*\\)[[:space:]]*/<port>\\1<\\/port>/\'\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,由于您没有在 周围添加任何引号$test,因此 shell 对变量的值执行分词和通配符扩展。也就是说,变量的值被视为以空格分隔的文件名列表,然后用单个空格连接。因此,如果您省略引号,则不必担心不同类型的空格,您可以编写echo $test | sed \'s/ *port *([0-9][0-9]*) */<port>\\1<\\/port>/\'. 但是,如果$test是port *,结果将取决于当前目录中存在哪些文件。