改变grep正则表达式输出

时间:2014-11-25 22:53:02

标签: regex bash hadoop

这个命令怎么来

使用此命令

hadoop fs -ls -R /path/to/dir/d_20141123* | grep -oE '(.*)?\/(.*)\/'

我得到了这个输出

-rw-r--r-- 2014-11-23 20:00 /path/to/dir/d_20141123-2301/
-rw-r--r-- 2014-11-23 20:00 /path/to/dir/d_20141123-2302/
-rw-r--r-- 2014-11-23 20:00 /path/to/dir/d_20141123-2303/
...
...

但是

hadoop fs -ls -R /path/to/dir/d_20141123* | grep -oE '\/(d_.*)\/'

我得到了输出:

/d_423432-342/
/d_231314-343/
...
...

但是用这个命令:

hadoop fs -ls -R /path/to/dir/d_20141123* | grep -oE '(d_\d+\-\d+)'

我没有输出。这是为什么?我删除的只是我的正则表达式中的正斜杠

1 个答案:

答案 0 :(得分:1)

  

我删除的只是我的正则表达式中的正斜杠

如果只是。您删除了正斜杠,删除了逃避它们的反斜杠,删除了.*,然后添加了\d+\-\d+

一次执行一项,您会发现问题:grep -E不支持\d作为[[:digit:]]的同义词。

重写使用[[:digit:]](POSIX)或使用grep -P(GNU):

grep -oE '(d_[[:digit:]]+-[[:digit:]]+)'
grep -oP '(d_\d+\-\d+)'

您还可以根据预期的输入以各种方式简化它:

grep -oE 'd_[^/]*'
grep -oE 'd_[0-9-]*'