egrep 在 SunOS 系统上无法按预期工作

egrep 在 SunOS 系统上无法按预期工作

这是我想在 SunOS 上实现的目标:

[text_text=text]只有像、[text=text][text]或 这样的模式才是text有效的模式,text我指的是 中的任何模式0-9,a-z,A-Z, space, newline, tab, enter。除此以外的任何模式都是无效模式。即egrep -v应该捕获它。像[[[text], [text]]], [text, 这样的模式text]也应该是无效的

我在 Linux box (RHEL) 上使用了以下命令,它工作得很好:

egrep -v "^[ ]*([a-zA-Z0-9\t\n\v\f\r ]*|\[{1}[_a-zA-Z0-9\t\n\v\f\r ]*(=[a-zA-Z0-9\t\n\v\f\r ]*)?\]{1})[ ]*$" file1

文件1:

[FEATURE_ID=2]
[FEATURE_REV=1]
[NO_OF_BYTES=18]
001203658080400160b9d0ae45000080
[CRC]
c068

在 RHEL BOX 上,egrep -v上面的语句没有按预期给出任何输出

我怎样才能在 Solaris 中实现这一点,因为同样不起作用并给出输出:

[FEATURE_ID=2]
[FEATURE_REV=1]
[NO_OF_BYTES=18]
[CRC]

答案1

正如 Solaris 上常见的情况一样,/usr/bin/egrep是一个不符合 POSIX 标准的遗留实现,而/usr/xpg4/bin/egrep是一个符合 POSIX 标准的实现,并且除了 POSIX 之外几乎没有任何东西。除非您运行的是 POSIX 之前的旧版 Solaris 应用程序,否则请确保/usr/xpg4/bin之前/usr/bin在你的$PATH

GNU 工具(您在 Linux 上习惯使用的工具)通常具有许多超出 POSIX 规定的功能。如果您需要可移植性,请坚持使用 POSIX。 POSIX 没有定义egrep;这是一个广泛的同义词grep -E,即grep扩展正则表达式句法。

Solaris/usr/bin/egrep不支持{…}出现次数计数。你只是{1}在这里使用,没有任何效果,所以直接放弃它。

egrepSolaris或Solaris 上的实现都不grep -E支持控制字符的反斜杠转义。这是一个 GNU 扩展。 POSIX 未定义反冲字母。使用[:space:]类而不是\t\n\v\f\r.

LC_CTYPE=C grep -Ev '^[ ]*([[:alnum:][:space:]]*|\[[_[:alnum:][:space:]]*(=[[:alnum:][:space:]]*)?\])[ ]*$' file1

相关内容