我有这个工作正则表达式(在正则表达式教练上测试):
\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
答案 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
^^
或者你可以使用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那样灵活。