我正在尝试使用awk将LDIF转换为JSON。
无法弄清楚每条多行记录前后的打印方式。可以每行一次或在每行前后以BEGIN和END打印一次。但是永远不会在每条记录之前和之后。
awk的实际LDIF输入为:
dn: CN=foo
objectClass: top
dn: CN=bar
objectClass: top
要转换为awk,需要输出如下所示:
{
"dn": "CN=foo",
"objectClass": "top"
}
{
"dn": "CN=bar",
"objectClass": "top"
}
脚本1用大括号将记录的每一行换行。
BEGIN {
RS="\n\n#";
FS=": ";
}
print "{"
{
print "\""$1"\": \""$2"\",";
}
print "}"
脚本2使用大括号括起来包装所有记录集:
BEGIN {
RS="\n\n#";
FS=": ";
print "{"
}
{
print "\""$1"\": \""$2"\",";
}
END{
print "}"
}
似乎awk仅具有BEGIN,END和隐式循环记录(单行或多行)。我不知道如何在每条多行记录之前和之后打印内容。这可能在awk中吗?是否有更好的方法将LDIF转换为JSON?
一个awk脚本(而不是一个衬里)会是什么,从LDIF到JSON的转换看起来会如此?
答案 0 :(得分:0)
idk您以为awk脚本会做些什么,但要从发布的输入中获得发布的预期输出,您需要做的是:
$ awk '!/^[{}]/{print ( (NR-1)%2 ? "{" ORS $0 : $0 ORS "}" )}' file
{
record1 line1
record1 line2
}
{
record2 line1
record2 line2
}
更新:给定的记录之前/之后,您输入的打印更新更简单:
$ awk -v RS= '{print "{" ORS $0 ORS "}"}' file
{
dn: CN=foo
objectClass: top
}
{
dn: CN=bar
objectClass: top
}
要获得您在问题中显示的输出,将是:
$ cat tst.awk
BEGIN { RS=""; FS="\n" }
{
print "{"
for (i=1; i<=NF; i++) {
tag = val = $i
sub(/:.*/,"",tag)
sub(/[^:]+:[[:space:]]*/,"",val)
printf " \"%s\": \"%s\"%s\n", tag, val, (i<NF ? "," : "")
}
print "}"
}
$ awk -f tst.awk file
{
"dn": "CN=foo",
"objectClass": "top"
}
{
"dn": "CN=bar",
"objectClass": "top"
}