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
时,语法会发生变化,您需要将加号反斜杠;但是如果没有这个选项,反斜杠是多余的(在这种情况下,在某些方言中实际上是错误的,包括GNUgrep
,其中反斜杠加号选择扩展含义,这当然是字符串开头的语法错误,没有前面的表达式重复一次或多次;但GNUgrep
只会默默地忽略它,而不会报告错误。)或)
另一方面,您的号码组也错了。[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
。请使用正确的数字,或者也可以允许国家代码有任何数字序列。)字符串中的点意味着什么?这仍然不能解决正则表达式的问题;它可能会找到一些匹配项,但不完全是预期的匹配项。