【问题标题】:extract string from binary file - regex issue从二进制文件中提取字符串 - 正则表达式问题
【发布时间】:2019-10-10 00:15:05
【问题描述】:

我有一个二进制文件,其中包含一个以“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 前缀,因为我在另一个答案中读到这会将所有二进制数据视为带有通配符的“消耗品”,但这没有区别(我可能误解了)。

我也试过移除开始和结束的锚点,但这也没什么区别。


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

【问题讨论】:

  • 也许您只需要sed -n -E 's/^.*name[0-9]{2}:(.*)[0-9]{2}:piece.*$/\1/p;'
  • 试试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$//'

标签: regex bash macos sed bsd


【解决方案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 将仅将捕获组值保留在结果中。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多