Um patch que não contém números de linha, é possível?

2

Eu adicionaria duas linhas de texto a um arquivo se elas ainda não existissem. As linhas podem estar em várias posições nesse arquivo. Então, um patch regular prefere não funcionar. Pode haver um patch simplificado, que contém apenas linhas para adicionar:

> Line 1
> Line 2

Isso não parece mais um patch regular. Eu acho que vou precisar de um software diferente de patch ?

    
por One Other 03.05.2016 / 11:43

3 respostas

2

Não é assim que os patches funcionam. O utilitário patch aplica um patch criado pelo utilitário diff executado em duas versões existentes de um arquivo ou conjunto de arquivos. As duas versões são estáticas e a aplicação do patch transformará uma na outra (ambas as direções são possíveis).

Para anexar apenas as linhas de um arquivo ( lines.in ) que estão completamente ausentes em outro arquivo ( file.dat ), você pode usar comm assim ( bash e ksh93 ):

comm -23 <( sort lines.in ) <( sort file.dat ) >>file.dat

As linhas adicionadas serão classificadas.

Uma solução que preserva a ordenação das linhas em lines.in :

grep -v -x -F -f file.dat lines.in >>file.dat

Isso usará grep para localizar todas as linhas em lines.in que não ( -v ) existem em file.dat ( -f file.dat ) e anexá-las a file.dat . As linhas completas são comparadas como strings fixas ( -x -F ).

    
por 31.07.2016 / 09:08
0

O problema surge ao atualizar os arquivos de configuração. Por exemplo, você pode fazer isso como funções de script de shell:

#!/bin/sh
add_data() {
    grep "^$2$" "$1" >/dev/null 2>/dev/null || echo "$2" >>"$1"
}

add_data program.conf "Line 1"
add_data program.conf "Line 2"

Neste exemplo, ancorei a expressão para que apenas as linhas que não possuem texto extra sejam correspondentes. Mas supõe que não há meta-caracteres nos dados. Esta chamada não adicionaria seu texto literal:

add_data program.conf ".*Line 2$"

Você poderia contornar isso escapando dos caracteres que provavelmente causariam um problema com o grep.

Comentadores apontam que é possível contornar esse problema usando o POSIX opção -x :

Consider only input lines that use all characters in the line excluding the terminating to match an entire fixed string or regular expression to be matching lines.

com este resultado:

#!/bin/sh
add_data() {
    grep -F -x "$2" "$1" >/dev/null 2>/dev/null || echo "$2" >>"$1"
}

add_data program.conf "Line 1"
add_data program.conf "Line 2"
add_data program.conf ".*Line 2$"
    
por 30.07.2016 / 20:39
0

Se você colocar apenas essas linhas para adicionar em um arquivo como:

Line 1
Line 2

Você poderia fazer:

pcregrep -xqM "\Q$(cat that-file)\E" file-to-patch ||
  cat that-file >> file-to-path

Isso pressupõe que that-file não contém \E e não termina em linhas vazias.

    
por 31.07.2016 / 12:15

Tags