我有一个像
这样的文件key\0value\n
akey\0value\n
key2\0value\n
我必须创建一个以单词为参数的脚本。我必须返回每个具有与参数完全相同的键的行。
我试过
grep -aF "$key\x0"
但是grep似乎不理解\ x0(\ 0相同的结果)。此外,我必须检查该行是否以" $ key \ 0"
开头我只能使用sed grep和tr以及其他没有加工命令
答案 0 :(得分:1)
要考虑\ 0,请尝试:
grep -Pa "^key\x0"
它对我有用。
答案 1 :(得分:1)
sed
sed
将有效:
$ sed -n '/^key1\x00/p' file
key1value
使用\x00
表示十六进制字符是sed
的GNU扩展。由于此问题已标记为linux
,因此不存在问题。
由于空字符显示效果不佳,可能(或可能不想)用这样的方式改进显示:
$ sed -n 's/^\(akey\)\x00/\1-->/p' file
akey-->value
sed
与包含特殊字符的键如果密钥本身可以包含sed或shell活动字符,那么我们必须首先对它们进行转义,然后对输入文件运行sed
:
#!/bin/bash
printf -v script '/^%s\\x00/p' "$(sed 's:[]\[^$.*/]:\\&:g' <<<"$1")"
sed -n "$script" file
要使用此脚本,只需将密钥作为命令行的第一个参数提供,当然用单引号括起来,以防止shell处理。
要了解它的工作原理,让我们依次看一下这些部分:
sed 's:[]\[^$.*/]:\\&:g' <<<"$1"
这会在所有sed-active字符前放置反斜杠。
printf -v script '/^%s\\x00/p' "$(sed 's:[]\[^$.*/]:\\&:g' <<<"$1")"
这将使用转义密钥创建sed
命令,并将其存储在shell变量script
中。
sed -n "$script" file
使用shell变量sed
作为script
命令运行sed
。
awk
问题表明awk
不是可接受的工具。但是,为了完整起见,这是一个awk
解决方案:
$ awk -F'\x00' -v k=key1 '$1 == k' file
key1value
说明:
-F'\x00'
awk
将输入划分为记录(行)并将记录划分为字段。在这里,我们将字段分隔符设置为空字符。因此,第一个字段(表示为$1
)是关键字。
-v k=key1
这会创建一个名为awk
的{{1}}变量,并将其设置为我们要查找的密钥。
k
此语句查找第一个字段与指定键匹配的记录(行)。如果找到匹配项,则会打印该行。