我正在尝试将 egrep 与正则表达式模式一起使用来匹配空格。
我之前在 Perl 和 C# 中使用过 RegEx,它们都支持\s
搜索空格的模式。egrep(或至少我正在使用的版本)似乎不支持这种模式。
在网上的几篇文章中,我遇到了一个简写 [[:space:]],但这似乎不起作用。任何帮助表示赞赏。
使用:SunOS 5.10
我在 SunOS 5.10 上看到了同样的问题。 /usr/bin/egrep
不支持扩展正则表达式。
尝试使用/usr/xpg4/bin/egrep
:
$ echo 'this line has whitespace
thislinedoesnthave' | /usr/xpg4/bin/egrep '[[:space:]]'
this line has whitespace
另一种选择可能是只使用 perl:
$ echo 'this line has whitespace
thislinedoesnthave' | perl -ne 'chomp;print "$_\n" if /[[:space:]]/'
this line has whitespace
如果您使用 grep 的“降级”版本(我引用该术语是因为我工作的大多数 UNIX 仍然使用原始 RE,而不是那些带有“ \s
”或“ [[:space:]]
”的花哨的 :-),您可以恢复到RE的最低形式。
例如,如果:space:
定义为空格和制表符,只需使用:
egrep '[ ^I]' file
那^I
是一个实际的制表符,而不是两个字符^
和I
。
:space:
这是假设定义为制表符和空格,否则调整[]
字符内的选择。
使用降级 RE 的优点是它们应该适用于所有平台(至少对于 ASCII;Unicode 或非英语语言可能有不同的规则,但我很少发现需要)。
如果您使用的是 bash,那么将制表符放在一行中的语法是
$'foo\tbar'
我最近正在使用 sed 对制表符分隔的文件进行一些修复。文件的一部分是:
sed -E -e $'s/\t--QUOTE--/\t"/g'
该参数由 bash 解析,并且 sed 看到一个带有文字标签的正则表达式。
也许你应该用引号保护模式(如果是 bash,或者你正在使用的 shell 的任何等效项)。
[ 和 ] 对 shell 可能有特殊含义。
$ cat > file
this line has whitespace
thislinedoesnthave
$ egrep [[:space:]] file
this line has whitespace
在debian下工作。
对于 Solaris,没有像(参见 gentoo)这样的“eselect”或替代文件来设置默认的 egrep 版本吗?
您是否尝试过 grep -E,因为如果您路径上的 egrep 不是好的,那么 grep 可能是。