这是我想在 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}
在这里使用,没有任何效果,所以直接放弃它。
egrep
Solaris或Solaris 上的实现都不grep -E
支持控制字符的反斜杠转义。这是一个 GNU 扩展。 POSIX 未定义反冲字母。使用[:space:]
类而不是\t\n\v\f\r
.
LC_CTYPE=C grep -Ev '^[ ]*([[:alnum:][:space:]]*|\[[_[:alnum:][:space:]]*(=[[:alnum:][:space:]]*)?\])[ ]*$' file1