У меня есть файл 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
Исходя из ваших сэмплов, звучит так, как будто вы действительно хотите добавить следующую строку (удаляя дополнительный пробел), если длина текущей строки ровно 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. Добавьте строку к предыдущему, если она начинается со знака равенства "=" из объяснения Питера Круминьса «Однострочники», чтобы присоединиться к строке после , когда она начинается с пробела
sed -e :a -e '$!N;s/\n //;ta' -e 'P;D' file.ldif
ПРИМЕЧАНИЕ. Если в ваших файлах используются окончания строки CRLF в стиле DOS / Windows, вам нужно заменить \n
в вышеприведенных выражениях на \r\n
то есть
sed '/.\{78\}/{N;s/\r\n //;}' file.ldif
или
sed -e :a -e '$!N;s/\r\n //;ta' -e 'P;D' file.ldif
Можно использовать 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