如何告诉grep继续下一步

如何告诉grep继续下一步,grep,Grep,我有一个巨大的文件,我想从中检索几个值(长数字)。大多数情况下,数字从行尾开始,一直持续到下一行的开头,grep无法全部检索到 例如,我的数字是这样的:-1234.1234567所以当我使用 grep -Eo '-[0-9]{4}.[0-9]{7}' 它不会返回所有值,因为有时数字是这样的: blah blah blah ....-1234.12 34567 blah blah blah 那么,有没有办法告诉grep继续查找(如果需要的话)下一行以检索数字的所有7位小数 谢谢您应该能够删

我有一个巨大的文件,我想从中检索几个值(长数字)。大多数情况下,数字从行尾开始,一直持续到下一行的开头,grep无法全部检索到

例如,我的数字是这样的:
-1234.1234567
所以当我使用

grep -Eo '-[0-9]{4}.[0-9]{7}' 
它不会返回所有值,因为有时数字是这样的:

blah blah blah ....-1234.12

34567 blah blah blah
那么,有没有办法告诉grep继续查找(如果需要的话)下一行以检索数字的所有7位小数


谢谢

您应该能够删除水平空白,然后执行grep

Try:
catmyfile | tr-d[:blank:| grep-Eo'-[0-9]{4}.[0-9]{7}'

如果要对目录中的所有文件执行此操作,可以使用for循环:

for i in *; do cat $i | tr -d [:blank:] | grep -Eo '-[0-9]{4}.[0-9]{7}'; done

这将满足您的要求(使用GNU awk作为ENDFILE):

例如:

$ cat file1
blah blah blah ....-1234.12

34567 blah blah blah

blah blah blah ....-2345.2345

678 blah blah blah

$ cat file2
blah blah blah ....-4321.12

34567 blah blah blah

blah blah blah ....-9876.2345

678 blah blah blah

$ gawk -v OFS=': ' '
{ rec = rec $0 }
ENDFILE {
    while ( match(rec,/-[[:digit:]]{4}[.][[:digit:]]{7}/) ) {
        print FILENAME, substr(rec,RSTART,RLENGTH)
        rec = substr(rec,RSTART+RLENGTH)
    }
    rec = ""
}
' file1 file2
file1: -1234.1234567
file1: -2345.2345678
file2: -4321.1234567
file2: -9876.2345678
请尝试使用一些真实的示例输入,其中包括边缘大小写,如以8位而不是7位结尾的字符串,并告诉我们任何其他要求


如果您没有GNU awk,那么您也可以使用一个函数,在FNR==1时调用match(),最后调用match()。还有各种各样的选择……

忘了提到我有1000多个文件注意到这一点。在您的中,可以重新匹配任何字符,而不仅仅是句点。这就是你想要的吗?另外,如果您的文件中存在类似hello-1234.1234567或-1234.12345678的字符串(即,您的目标字符串是否需要用某些东西分隔),您希望发生什么情况?您如何知道由换行符分隔的两个数字何时应保持为两个独立的数字或被串联?这同样适用于所有由空格分隔的数字串吗?谢谢。但它没有起作用。仍然没有返回继续到下一行的数字。通过在tr命令中添加[:blank:]修复了此问题。但是,是否有一种方法可以同时处理1000多个文件?Thanks@user3157486我认为您可以使用grep搜索目录中的文件。这就是你要找的吗?根据你上面提出的命令,它使用cat,并且可以在单个文件上成功完成,但是我有1000多个文件,比如cat不使用*.txt。有办法解决这个问题吗?感谢您可以使用for循环对所有文件单独执行此命令
$ cat file1
blah blah blah ....-1234.12

34567 blah blah blah

blah blah blah ....-2345.2345

678 blah blah blah

$ cat file2
blah blah blah ....-4321.12

34567 blah blah blah

blah blah blah ....-9876.2345

678 blah blah blah

$ gawk -v OFS=': ' '
{ rec = rec $0 }
ENDFILE {
    while ( match(rec,/-[[:digit:]]{4}[.][[:digit:]]{7}/) ) {
        print FILENAME, substr(rec,RSTART,RLENGTH)
        rec = substr(rec,RSTART+RLENGTH)
    }
    rec = ""
}
' file1 file2
file1: -1234.1234567
file1: -2345.2345678
file2: -4321.1234567
file2: -9876.2345678