Regex 使用grep查找结果并写入文件

Regex 使用grep查找结果并写入文件,regex,bash,grep,Regex,Bash,Grep,我想通过grep或egrep从我计算机上的文件中获取所有结果 刚刚发现查找字符串的正则表达式 “+33……”由以下正则表达式生成 \+33.[0-9].[0-9].[0-9].[0-9].或者这是不正确的 我的grep命令是: grep '\+31.[0-9].[0.9].[0.9].[0-9]' Samsung\ GT-i9400\ Galaxy\ S\ II.xry >> resultaten.txt 输出文件仅提供以下信息: "Binary file Samsung GT-

我想通过
grep
egrep
从我计算机上的文件中获取所有结果

刚刚发现查找字符串的正则表达式

“+33……”由以下正则表达式生成

\+33.[0-9].[0-9].[0-9].[0-9].
或者这是不正确的

我的
grep
命令是:

grep '\+31.[0-9].[0.9].[0.9].[0-9]' Samsung\ GT-i9400\ Galaxy\ S\ II.xry  >> resultaten.txt
输出文件仅提供以下信息:

"Binary file Samsung GT-i9400 .xry matches"
。。。。。没有给出结果


有人能帮我获取结果并写入文件吗?

这意味着您正在查找匹配项,但您正在查找的文件不是文本文件,而是包含不可打印字节的二进制文件。如果您真的想grep该文件,请尝试:

strings Samsung\ GT-i9400\ Galaxy\ S\ II.xry | grep '+31.[0-9].[0.9].[0.9].[0-9]' >> resultaten.txt

首先,
grep
的默认行为是打印包含匹配项的行。因为二进制文件不包含行,所以它只在二进制文件中找到匹配项时打印消息。但是,这可以用
-a
标志覆盖

但是,你最终会遇到这样一个问题,即它打印的“线”是无用的。您可能希望添加
-o
选项,以仅打印实际匹配的子字符串

最后,您的正则表达式一点也不正确。单点
是一个元字符,它匹配任何字符,包括控制字符或其他非文本字符。考虑到正则表达式的长度,您不太可能捕捉到误报,但您可能希望解释您希望圆点匹配的内容。我将其替换为
[.-]
,它匹配一个空格和一些在电话号码中常见的标点符号。可能会扩展或更改它,具体取决于您对电话号码的期望

在常规的
grep
中,加号只匹配自身。使用
grep-E
时,语法会发生变化,您需要将加号反斜杠;但是如果没有这个选项,反斜杠是多余的(在这种情况下,在某些方言中实际上是错误的,包括GNU
grep
,其中反斜杠加号选择扩展含义,这当然是字符串开头的语法错误,没有前面的表达式重复一次或多次;但GNU
grep
只会默默地忽略它,而不会报告错误。)或)

另一方面,您的号码组也错了。
[0-9]
匹配一个数字,显然是为了匹配多个数字。为了方便起见,我将使用
grep-E
扩展名,它允许
+
匹配前一个字符的一个或多个重复。然后我们还可以访问
将标点表达式标记为可选

结束时,请尝试以下操作:

grep -Eao '\+33[0-9]+([^ ._-]?[0-9]+){3}' \
   'Samsung GT-i9400 Galaxy S II.xry' >resultaten.txt
就人类而言,这需要一个文字
+33
,后跟所需的附加数字,然后后跟三个数字组,每个数字组包含一个或多个数字,每个数字组前面可以选择标点符号

这将覆盖通常所需的
resultaten.txt
;您的追加操作在许多情况下也有意义,因此如果您确实需要,请将其更改回原来的操作

如果模板中的每个点表示所需的数字,空格表示所需的标点符号,则以下内容更接近您试图指定的内容:

\+33[0-9]([^ ._-][0-9]{3}){2}[^ ._-][0-9]{2}
也就是说,33后面有一个必需的数字,然后是两组正好三个数字和两个数字中的一个,每组前面有一个非可选的间距或标点字符


(您的说明有
+33
,而您的实际示例有
+31
。请使用正确的数字,或者也可以允许国家代码有任何数字序列。)

字符串中的点意味着什么?这仍然不能解决正则表达式的问题;它可能会找到一些匹配项,但不完全是预期的匹配项。