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

时间:2015-03-11 13:31:55

标签: regex bash grep

我希望从我计算机上的文件中获取grepegrep的所有结果。

刚刚发现找到字符串

的正则表达式

'+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"

.....并且没有给出结果。

有人可以帮助我获取结果并写入文件吗?

2 个答案:

答案 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}}。请使用正确的,或者也许允许国家/地区代码的任何数字序列。)