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

标签 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/'

问题是正则表达式不会消耗整个文件,所以除了捕获的文件名之外,我还得到了很多随机返回的东西。

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

我也试过删除开始和结束 anchor ,但这也没有什么区别。


*该文件是一个种子文件,我只想从中提取文件名。我已经查看了 bencoding 并尝试提取文件名,但对于一项微不足道的任务来说这似乎太复杂了。

最佳答案

你可以使用

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

关于regex - 从二进制文件中提取字符串 - 正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56274921/

相关文章:

bash - 遍历 URL

swift - Mac 上的 AVAudioPlayer 无法播放/崩溃

php - simplexml_load_file结果为空页

R:使用转换表更新 data.frame 中的行名

javascript - 无法解析 - Javascript 中的正则表达式

bash - cd 使用 bash rematch 和 pwd 的结果

bash - 使用 sed、shell 或其他方式进行内联文本替换

macos - 在 mac os 上的 nasm 中编译汇编程序

javascript - 在单个单词中匹配大写、帕斯卡命名法和驼峰命名法

regex - 带条件替换的正则表达式