从二进制文件中提取字符串-正则表达式问题

时间:2019-05-23 12:10:18

标签: regex bash macos sed bsd

我有一个二进制文件,其中包含一个以'namexx:'和'xx:piece'为边界的可读文件名*,其中x均为两种情况下的0-9之间的任何数字。

我正在使用bash 5在Mac上工作。

我尝试使用sed:

cat filename.xxx | sed -E 's/^.*name[0-9]{2}:(.*)[0-9]{2}:piece.*$/\1/'

问题在于正则表达式不会占用整个文件,因此除了捕获的文件名之外,我还返回了很多随机的东西。

当我在另一个答案中读到时,我曾尝试用LC_ALL=C前缀sed,因为这会将所有二进制数据都视为带通配符的“消耗性”,但这没有什么区别(我可能会误解了)。

我也尝试过删除开始和结束锚点,但这也没有区别。


*该文件是种子文件,我只想从中提取文件名。我已经查看了bencoding并尝试提取文件名,但是对于琐碎的任务来说似乎太复杂了。

1 个答案:

答案 0 :(得分:1)

您可以使用

sed -n -E 's/^.*name[0-9]{2}:(.*)[0-9]{2}:piece.*$/\1/p;' filename.xxx

在这里,-n禁止打印行,而p打印匹配项(替换后仍保留)。

或者,您可以使用类似的

grep -m 1 -o 'name[0-9]\{2\}:\(.*\)[0-9]\{2\}:piece' filename.xxx | \
   sed -E 's/^name[0-9]{2}:(.*)[0-9]{2}:piece$/\1/'

第一个grep仅提取第一个(-m 1)匹配项,然后sed仅将捕获组值保留在结果内。