Acrescentar o conteúdo do documento a um arquivo, somente se esse conteúdo ainda não existir nesse arquivo

2

Eu tenho um arquivo para o qual eu quero acrescentar algum conteúdo (incluindo o primeiro, segundo e terceiro espaços vazios visíveis no meu código abaixo):


### I am text 1

### I am text 2

(O texto real que eu adiciono é muito mais longo que estas 5 linhas).

Para simplesmente adicionar conteúdo a um arquivo, eu faço:

cat <<-"EOF" >> myPath/myFile
    content...
EOF

Mas como eu poderia garantir que o heredocument acrescentaria o conteúdo apenas se o conteúdo já não existir em um arquivo e, caso contrário, a operação seria abortada?

Se apenas parte do conteúdo do bloco já existir no arquivo, toda a operação também deve ser abortada.

    
por user9303970 13.06.2018 / 07:34

2 respostas

3

Se o documento aqui só deve ser adicionado se nada estiver presente, você pode usar grep :

cat <<-"EOF1" > myPath/myFile.append
    content...
EOF1
if ! grep -F -q -f myPath/myFile{.append,}; then
    cat myPath/myFile.append >> myPath/myFile
fi

Para entender isso, considere o seguinte.

  • grep -F -q -f myPath/myFile{.append,} é expandido pelo shell para grep -F -q -f myPath/myFile.append myPath/myFile .

  • O comando grep pesquisa myPath/myFile (o arquivo ao qual o texto deve ser adicionado, se necessário) para qualquer sequência fixa ( -F ) contida em myPath/myFile.append (o arquivo que contém o texto a ser adicionado) ), lendo um padrão por linha ( -f ), e indica se encontra algum somente por seu código de saída , sem saída ( -q ).

  • O resultado é então negado em ! , de modo que a% if do bloco then seja executada somente se grep não encontrar nada.

por 13.06.2018 / 08:22
0

Por favor, não feche esta resposta, mas a de Stephen é a que eu marquei como correta. Isso é apenas uma variação mais fácil para mim.

Se o conteúdo do arquivo de modelo só deve ser anexado ao arquivo final se nenhum deles já estiver presente no arquivo final, você poderá usar grep :

cat <<-"EOF1" > myPath/myTemplate
    content...
EOF1

if ! grep -F -q -f myPath/myFile myPath/myTemplate; then
    cat myPath/myTemplate >> myPath/myFile
fi

O comando grep pesquisa myPath/endFile.sh para qualquer sequência fixa ( -F ) contida em myPath/myTemplate , lendo um padrão por linha ( -f ) e indica se encontra algum apenas por sua código de saída , sem saída ( -q ).

O resultado é negado em ! , de modo que o bloco then do bloco if-then só será executado se grep não corresponder a nada no arquivo final.

Apêndice - códigos de saída:

Quando um processo sai, ele retorna um código de saída, que é um inteiro pequeno. Por convenção, um código de saída 0 indica sucesso, não zero indica falha ou erro:

  • grep retorna 0 quando encontra uma correspondência e 1 se não encontrar.

  • if usa o código de saída do seu argumento para decidir o que fazer; se 0, processa o bloco then , caso contrário, o bloco else (se houver).

  • Uma pontuação ( ! ) inverte isso; O bloco then só é executado se o grep não corresponder a nada (ou encontrar um erro).

por 16.06.2018 / 19:46