我希望从我计算机上的文件中获取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"
.....并且没有给出结果。
有人可以帮助我获取结果并写入文件吗?
答案 0 :(得分:1)
这意味着您找到了匹配项,但您grep
的文件不是文本文件,它是包含不可打印字节的二进制文件。如果你真的想要grep该文件,请尝试:
strings Samsung\ GT-i9400\ Galaxy\ S\ II.xry | grep '+31.[0-9].[0.9].[0.9].[0-9]' >> resultaten.txt
答案 1 :(得分:1)
首先,grep
的默认行为是打印包含匹配项的行。因为二进制文件不包含行,所以它只在二进制文件中找到匹配时才打印消息。但是,可以使用-a
标记覆盖此内容。
然而,你最终遇到的问题是" line"它打印没用。您可能希望添加-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. ... ... ..
,这通常是你想要的;你在许多情况下也有意义的追加操作,所以如果它实际上是你想要的那样就改回来。
如果模板\+33[0-9]([^ ._-][0-9]{3}){2}[^ ._-][0-9]{2}
中的每个点代表一个必需的数字,并且空格代表所需的标点符号,则以下内容更接近您尝试指定的内容:
+33
也就是说,在33之后有一个必需的数字,然后是两组正好三个数字和两个中的一个,每个组前面都有一个非可选的间距或标点字符。
(您的博览会有+31
,而您的实际示例有{{1}}。请使用正确的,或者也许允许国家/地区代码的任何数字序列。)