Sed - 模式匹配二进制值作为分隔符?

时间:2011-05-18 23:18:55

标签: sed

是否可以在sed模式匹配中使用二进制值?

我有一个单行字符串,其中包含由二进制值1分隔的纯文本字段作为分隔符。

是否可以将sed用于二进制分隔符1的所有内容?

或者我应该使用awk

示例字符串\x1表示二进制值1:

key1=value1\x1key2=value2\x1key3=value3

预期输出示例,key1key2的值:

value1 value2

3 个答案:

答案 0 :(得分:3)

编辑:以下是基于键列表打印值的几个选项,无法用awk找出更简洁的方法,但可能存在一个:< / p>

$ echo -e 'key1=value1\001key2=value2\001key3=value3' > test

$ sed 's/\x01/\n/g' test | awk -F= '{if ($1 == "key1" || $1 == "key2") print $2}'
value1
value2

$ sed 's/\x01/\n/g' test | perl -pe 's/((key1|key2)=(.*)|.*)/\3/'
value1
value2

由于\x1不支持非贪婪匹配,您无法匹配第一个sed以外的所有内容,您的选项是使用其他语言,或类似以下内容:

$ sed 's/\x01/\n/g' test | head -n 1
key1=value1

以下问题的答案有一个使用Perl正则表达式进行非贪婪匹配的好例子:
Non greedy regex matching in sed?

答案 1 :(得分:0)

你必须找到一种方法在命令中获取二进制文件中的\ x1,因为sed不解析它。例如,将它们全部转换为新行:

sed -e "s/$(echo -e \\001)/\n/g" filename

答案 2 :(得分:0)

在您希望角色\001出现的位置键入 Control-A

如果正则表达式中有任何反斜杠,我会发现这比处理所有必要的转义更容易让echo生成正确的字符串 - 而且我发现经常有这样的反斜杠。