我有一个 Ldif 文件,我想从中提取一些行。
LDIF 每行 78 个字符,因此,只要有一行包含超过 78 个字符,它就会被分成两行。
我想要的是计算包含 78 个字符的行,如果是的话,我将删除回车符以重新构建我的行。
因此我寻找一个函数或任何其他方法来计算该行是否有 78 个字符,如果是,则删除回车符。
例子:
description: Gestion des acces de la CR 902 sur les environnements Big Data en
ecriture
distinguishedName: CN=GU_902_A_D5_IC_W,OU=Groupes,OU=CR 902,OU=CAM,DC=LDSCOMPT
ES
instanceType: 4
whenCreated: 20180115131643.0Z
我需要的结果:
description: Gestion des acces de la CR 902 sur les environnements Big Data en ecriture
distinguishedName: CN=GU_902_A_D5_IC_W,OU=Groupes,OU=CR 902,OU=CAM,DC=LDSCOMPTES
instanceType: 4
whenCreated: 20180115131643.0Z
答案1
根据您的示例,听起来您真正想要做的是如果当前行正好是 78 个字符长,则附加以下行(删除额外的空格字符):
$ sed '/.\{78\}/{N;s/\n //;}' file.ldif
description: Gestion des acces de la CR 902 sur les environnements Big Data en ecriture
distinguishedName: CN=GU_902_A_D5_IC_W,OU=Groupes,OU=CR 902,OU=CAM,DC=LDSCOMPTES
instanceType: 4
whenCreated: 20180115131643.0Z
一种可能不那么脆弱的方法可能是适应40. 如果一行以等号“=”开头,则将其附加到上一行来自 Peter Krumins 的Sed 单行命令详解加入下列的当它开始带有空格
sed -e :a -e '$!N;s/\n //;ta' -e 'P;D' file.ldif
注意:如果您的文件使用 DOS/Windows 样式的 CRLF 行尾,则您需要将\n
上述表达式替换为\r\n
ie
sed '/.\{78\}/{N;s/\r\n //;}' file.ldif
或者
sed -e :a -e '$!N;s/\r\n //;ta' -e 'P;D' file.ldif
答案2
您可以使用awk
:
awk '{substr($0,78,78)==""?a="\n":a="";printf "%s"a,$0}'
此命令只是检查每行的第 78 个字符是否为空,并打印带或不带换行符的行。
从您的示例中,我发现还插入了缩进(谁做的?!),要删除这些前导的额外空格,请将命令修改为:
awk '{gsub(/^ /,"",$0);substr($0,78,78)==""?a="\n":a="";printf "%s"a,$0}'
如果文件中有不需要的回车符,也请将其删除:
awk '{gsub(/\r/,"",$0);gsub(/^ /,"",$0);substr($0,78,78)==""?a="\n":a="";printf "%s"a,$0}'
示例运行
$ <test awk '{gsub(/^ /,"",$0);substr($0,78,78)==""?a="\n":a="";printf "%s"a,$0}'
description: Gestion des acces de la CR 902 sur les environnements Big Data en ecriture
distinguishedName: CN=GU_902_A_D5_IC_W,OU=Groupes,OU=CR 902,OU=CAM,DC=LDSCOMPTES
instanceType: 4
whenCreated: 20180115131643.0Z