使用sed从文件中提取ascii十六进制字符串

时间:2014-06-16 00:09:56

标签: bash shell sed hex ascii

我有一个看起来像这样的文件:

$ some random
$ text
00ab2c3f03$ and more
random text
1a2bf04$ more text
blah blah

以及看起来像这样的代码:

sed -ne 's/\(.*\)$ and.*/\1/p'  "file.txt" > "output1.txt"
sed -ne 's/\(.*\)$ more.*/\1/p' "file.txt" > "output2.txt"

这给了我00ab2c3f031a2bf04

因此它从行的开头提取任何内容到shell prompt并将其存储在文件中,两次用于两个不同的实例。

问题是文件有时看起来像这样:

/dir # some random
/dir # text
00ab2c3f03/dir # and more
random text
345fabd0067234234/dir # more text
blah blah

我想制作一个通用的提取器:

  • 从行首开始将数据提取到' $'或' /'字符
  • 智能地从行的开头提取随机数量的随机hex数据,直到第一个non-hex数字

但我sed实际上并没有想到一个简单的解决方案......

2 个答案:

答案 0 :(得分:1)

我认为你想要这样的输出,

$ cat file
$ some random
$ text
00ab2c3f03$ and more
random text
1a2bf04$ more text
blah blah
/dir # some random
/dir # text
00ab2c3f03/dir # and more
random text
345fabd0067234234/dir # more text
blah blah

$ sed -ne 's/\([a-f0-9]*\).* and more.*/\1/p' file
00ab2c3f03
00ab2c3f03

$ sed -ne 's/\([a-f0-9]*\).* more text.*/\1/p' file
1a2bf04
345fabd0067234234

您也可以尝试使用以下GNU sed命令。由于输入中存在/,我将sed分隔符更改为~

$ sed -nr 's~([a-f0-9]*)\/*\$*.* and more.*~\1~p' file
00ab2c3f03
00ab2c3f03

$ sed -nr 's~([a-f0-9]*)\/*\$*.* more text.*~\1~p' file
1a2bf04
345fabd0067234234

说明:

  • ([a-f0-9]*) - 捕获所有hexdigits并将其存储到一个组中。

  • OP表示可能会在十六进制数字后面出现/$符号,因此正则表达式应为\/*\$*/零或更多捕获组后的次数,$零次或多次。

  • 第一个命令仅适用于包含字符串and more的行。

  • 第二个仅适用于包含more text的行,因为操作系统希望将两个输出放在两个不同的文件中。

答案 1 :(得分:0)

这对我来说似乎更好:

sed -nr 's#([[:xdigit:]]+)[$/].*#\1#p' file