egrep正则表达式不适用于其他程序中使用的正则表达式

时间:2010-10-23 17:15:55

标签: regex grep

我有这个工作正则表达式(在正则表达式教练上测试):

\n[\s]*[0-9]*[\s]*[0-9]*(\.)?[0-9]*(e\+)?[0-9]*

应该拿起这个文件的前两列

http://wwwhomes.uni-bielefeld.de/achim/highly.txt

我通读了手册页,并说它会在行的开头匹配,所以我用^替换了\ n 但是当我这样做时,egrep不同意我的意见:

egrep -e ^[\s]*[0-9]*[\s]*[0-9]*(\.)?[0-9]*(e\+)?[0-9]* "wwwhomes.uni-bielefeld.de achim highly.txt"

编辑:它与(e\+)?

有关

编辑2:好的,我正在简化正则表达式。忘记尝试用科学记数法获取数字就是我正在使用的东西:

egrep -e "^[[:space:]]*[0-9]*[[:space:]]*[0-9]*" "wwwhomes.uni-bielefeld.de achim highly.txt"

它返回标题行:

   no       number      divisors    2 3 5 71113171923293137414347535961677173
------------------------------------------------------------------------------

这不对......

最终编辑:

我需要grep和sed的组合来获取正确的数据。 grep删除了标题行,sed格式化了文本

grep  -E -o -e "^[[:space:]]+[0-9]+[[:space:]]+[0-9e\+\.]+[[:space:]]+[0-9e\+\.]+" "wwwhomes.uni-bielefeld.de achim highly.txt" >grepped.txt

sed -r "s/^\s*[0-9]+\s*([0-9.e+]+)\s*([0-9.e+]+)/\1,\2/" "grepped.txt" >seded.txt 

3 个答案:

答案 0 :(得分:2)

ERE不支持\s。对[[:space:]]使用\s,或仅使用

似乎^指向尚未匹配的文本的开头。我不知道为什么。(仅在Mac OS X上的grep(GNU grep)2.5.1上这种行为是正确的吗?)

正则表达式与标题行匹配,因为正则表达式中的所有元素都是可选的。您需要将其中一些*更改为+


由于文件采用固定长度格式,因此使用cut比构造正则表达式要容易得多。

cut -c 1-20 highly.txt

您可以使用grep -v过滤掉不需要的结果。

答案 1 :(得分:1)

尝试向grep添加-o选项,使其仅打印与模式匹配的部分,而不是具有该模式的行:

egrep -o -e  "^[[:space:]]*[0-9]*[[:space:]]*[0-9.e+]*" file
      ^^

Working link

或者你可以使用sed作为:

sed -r 's/^\s*([0-9]+)\s*([0-9.e+]+).*/\1 \2/' file

答案 2 :(得分:0)

如果您的数据看起来格式正确,并且您可以识别分隔符(例如,在您的情况下,制表符/空格),则无需使用正则表达式。使用awk。

awk '!/--/&&$1!="no"{print $1,$2}' file

我相信这一个班轮就是您所需要的,因为您说要获得前2列并跳过标题。您也可以使用cut,但它不像awk那样灵活。