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

3

我有一个包含可读文件名的二进制文件,该文件名被'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/'

问题在于正则表达式没有消耗整个文件,因此除了捕获的文件名之外,还会返回很多随机内容。
我尝试在sed前面加上LC_ALL=C,因为我在另一个答案中读到这样做可以将所有二进制数据视为可用通配符进行匹配,但是没有任何区别(可能我误解了)。
我还尝试过删除开头和结尾的锚点,但也没有任何区别。
*该文件是一个torrent文件,我只想提取文件名。我查看了bencoding并尝试提取文件名,但对于一个琐碎的任务来说似乎太复杂了。

也许你只需要 sed -n -E 's/^.*name[0-9]{2}:(.*)[0-9]{2}:piece.*$/\1/p;' - Wiktor Stribiżew
尝试运行以下命令:grep -m 1 -o 'name[0-9]\{2\}:\(.*\)[0-9]\{2\}:piece' filename.xxx | sed 's/^name[0-9]\{2\}://' | sed 's/[0-9]\{2\}:piece$//' - Wiktor Stribiżew
1个回答

2

您可以使用

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 只会在结果中保留捕获组的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接