我有一个二进制文件,其中包含一个以'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并尝试提取文件名,但是对于琐碎的任务来说似乎太复杂了。
答案 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
仅将捕获组值保留在结果内。