imprime linha vazia na saída sed ao passar vários nomes de arquivos

2

Estou fazendo algumas substituições de espaço reservado em vários arquivos que estou alimentando para ldapadd , para adicionar novas entradas a um diretório LDAP:

sed \
    -e 's/%%FOO%%/whatever/g' \
    -e 's/%%BAR%%/other thing/g \
    file1.ldif.template \
    file2.ldif.template \
    | ldapadd -x -D 'cn=admin,dc=example,dc=com' -W

O problema que estou tendo com isso é que, se não houver uma linha vazia no final de file1.ldif.template , o primeiro registro em file2 será concatenado ao último registro em file1 e em ldif arquivos diferentes registros devem ser separados por pelo menos 1 nova linha.

É claro que eu poderia adicionar uma linha vazia no final de file1 , mas é muito fácil falhar no futuro se algum outro desenvolvedor (ou seus editores) removerem as novas linhas finais.

Então, para resumir. Saída sed atual (simplificada):

dn: cn=record1_file1,dc=example,dc=com
cn: record1_file1

dn: cn=record2_file1,dc=example,dc=com
cn: record2_file1
dn: cn=record1_file2,dc=example,dc=com
cn: record1_file2

dn: cn=record2_file2,dc=example,dc=com
cn: record2_file2

Saída desejada (simplificada):

dn: cn=record1_file1,dc=example,dc=com
cn: record1_file1

dn: cn=record2_file1,dc=example,dc=com
cn: record2_file1

dn: cn=record1_file2,dc=example,dc=com
cn: record1_file2

dn: cn=record2_file2,dc=example,dc=com
cn: record2_file2

Estou trabalhando no Linux (fedora 21) usando o GNU sed. Portabilidade não é uma preocupação (mas eu prefiro uma solução portátil sobre uma solução GNU).

    
por Carlos Campderrós 03.07.2015 / 13:04

2 respostas

2

Usando a extensão GNU sed -s (--separate) , você pode anexar uma nova linha vazia após cada nome de arquivo (os endereços de linha referem-se a cada nome de arquivo, em vez de tratar todas as entradas como um fluxo mais longo, semelhante a awk ' FNR e NR variables)

sed \
    -s \
    -e '$a\' \
    -e 's/%%FOO%%/whatever/g' \
    -e 's/%%BAR%%/other thing/g \
    file1.ldif.template \
    file2.ldif.template \
    | ldapadd -x -D 'cn=admin,dc=example,dc=com' -W

Portanto, usar -s com -e '$a\' é o que faz com que sed insira uma nova linha no final de todos os arquivos de entrada.

    
por 03.07.2015 / 13:04
2

Uma maneira fácil e portátil é inserir um arquivo com uma linha vazia no argumentos de arquivo:

# create file with one empty line
echo > emptyline.txt

# calling sed:
sed -e 's/%%FOO%%/whatever/g' \
    -e 's/%%BAR%%/other thing/g \
    file1.ldif.template \
    emptyline.txt \
    file2.ldif.template \ 
    | ...

Algumas conchas também suportam isso:

sed -e 's/%%FOO%%/whatever/g' \
    -e 's/%%BAR%%/other thing/g \
    file1.ldif.template \
    <(echo) \
    file2.ldif.template \ 
    | ...
    
por 03.07.2015 / 13:52