使用 bash 删除回车符

使用 bash 删除回车符

我有一个 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\nie

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

相关内容