是否可以在sed
模式匹配中使用二进制值?
我有一个单行字符串,其中包含由二进制值1分隔的纯文本字段作为分隔符。
是否可以将sed
用于二进制分隔符1的所有内容?
或者我应该使用awk
?
示例字符串\x1
表示二进制值1:
key1=value1\x1key2=value2\x1key3=value3
预期输出示例,key1
和key2
的值:
value1 value2
答案 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
生成正确的字符串 - 而且我发现经常有这样的反斜杠。