remove o retorno do carro com o bash

0

Eu tenho um arquivo Ldif que gostaria de extrair algumas linhas de.

o LDIF é 78 caracteres por linha, então sempre que houver uma linha com mais de 78 caracteres, ela será dividida em duas linhas.

o que eu quero é contar a linha que contém 78 caracteres e, se for o caso, removerei o retorno de carro para reconstruir minha linha novamente.

então eu procuro por uma função ou qualquer outra maneira de contar se a linha tiver 78 caracteres e remover o retorno de carro em caso afirmativo.

exemplo:

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

resultado eu preciso:

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
    
por HISI 30.01.2018 / 12:56

2 respostas

3

Com base em seus exemplos, parece que o que você realmente quer fazer é anexar a seguinte linha (removendo um caractere de espaço adicional) se a linha atual tiver exatamente 78 caracteres:

$ 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

Uma abordagem possivelmente menos frágil pode ser a de adaptar 40. Anexe uma linha à anterior, se ela começar com um sinal de igual "=" de Peter Krumins Um-Forro de Explicado de Sed para se juntar à linha seguinte quando começa com um espaço

sed -e :a -e '$!N;s/\n //;ta' -e 'P;D' file.ldif

NOTA: se os seus arquivos usarem finais de linha CRLF no estilo DOS / Windows, você precisará substituir \n nas expressões acima por \r\n , por exemplo.

sed '/.\{78\}/{N;s/\r\n //;}' file.ldif

ou

sed -e :a -e '$!N;s/\r\n //;ta' -e 'P;D' file.ldif
    
por steeldriver 30.01.2018 / 13:30
2

Você pode usar awk para isso:

awk '{substr($0,78,78)==""?a="\n":a="";printf "%s"a,$0}'

Este comando simplesmente verifica se o caractere 78. de cada linha está vazio e imprime a linha com ou sem quebra de linha.

Do seu exemplo eu entendi que também havia um recuo inserido (quem faz isso?!?), para remover esses espaços extras principais, modifique o comando para:

awk '{gsub(/^ /,"",$0);substr($0,78,78)==""?a="\n":a="";printf "%s"a,$0}'

Se você tiver retornos de carro indesejados no arquivo, remova-os também:

awk '{gsub(/\r/,"",$0);gsub(/^ /,"",$0);substr($0,78,78)==""?a="\n":a="";printf "%s"a,$0}'

Exemplo de execução

$ <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
    
por dessert 30.01.2018 / 13:19