【问题标题】:sed command is working in solaris but not in Linuxsed 命令在 solaris 中有效,但在 Linux 中无效
【发布时间】:2015-10-09 18:42:48
【问题描述】:

我是 shell 脚本和sed 命令的新手。

以下sed 命令在 Solaris 中运行,但在 Linux 中出错:

sed -n 's/^[a-zA-z0-9][a-zA-z0-9]*[ ][ ]*\([0-9][0-9]*\).*[/]dir1[/]subdir1\).*/\2:\1/p'

错误是:

sed: -e expression #1, char 79: Invalid range end

我不知道为什么它会给出无效的范围结束错误。

【问题讨论】:

  • 字符范围 A-z 包括 所有 个字符,其 ASCII 值介于 A 和 z 之间。这包括上下 alpha,以及[、]、\、^、_ 和反引号。这可能不是故意的,是吗?
  • @Mr.Llama 是的,这不是故意的。一旦我将 A-z 更改为 A-Z,它现在就可以工作了
  • [a-zA-z0-9] 等价于[[:alnum:]](是的,带双括号)
  • 如果您需要 Solaris 和 Linux 之间的 sed 语法一致,最好在您的 Solaris 系统上安装 GNU sed。

标签: regex linux bash shell sed


【解决方案1】:

Linux Sed 似乎不喜欢你的A-z(两次)。无论如何,这没有任何意义。

使用[A-Z](大写Z)

【讨论】:

  • 谢谢.. 它使用大写 Z。看来 solaris 对它的解释与 Linux 不同
【解决方案2】:

正如 blue112 所说,A-z 作为一个范围是没有意义的。 Solaris sed 将其解释为“A 的 ASCII 代码通过 z 的 ASCII 代码”,在这种情况下,您可能会遇到意外匹配。 A-Z 在 ASCII 中出现在 a-z 之前,但在 Z 和 a 之间有一些字符。

59 Y
5a Z
----
5b [
5c \
5d ]
5e ^
5f _
60 `
----
61 a
62 b

这是一个显示 Solaris sed 的示例(在本例中为 Solaris 8)。鉴于此范围,它将替换 _ 和 \ 以及您显然定位的字母。

% echo "f3oo_Ba\\r" | /usr/bin/sed  's/[A-z]/./g';echo
.3.....

(请注意,3 没有被替换,因为它不属于指定的 ASCII 范围。)

GNU sed 保护您免于误伤自己的脚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2017-10-12
    • 2019-07-30
    相关资源
    最近更新 更多