Un parche que no contiene numbers de línea, ¿es posible?

Agregaría dos líneas de text a un file si aún no existen allí. Las líneas pueden estar en varias posiciones en ese file. Entonces, un parche regular no funcionará. ¿Puede haber un parche simplificado que solo contenga líneas para agregar?

> Line 1 > Line 2 

? Esto ya no se siente como un parche regular. ¿Supongo que necesitaré otro software además del patch ?

Así no es como funcionan los parches. La utilidad de patch aplica un parche creado por la utilidad diff ejecutada en dos versiones existentes de un file o set de files. Las dos versiones son estáticas y la aplicación del parche transformará una en la otra (ambas direcciones son posibles).

Para agregar las líneas de un file ( lines.in ) que faltan por completo en otro file ( file.dat ), puede usar comm como este ( bash y ksh93 ):

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

Las líneas agregadas serán orderadas.

Una solución que preserva el order de las líneas en lines.in :

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

Esto usará grep para encontrar todas las líneas en lines.in eso no ( -v ) existe en file.dat ( -f file.dat ) y lo file.dat a file.dat . Las líneas completas se comparan como cadenas fijas ( -x -F ).

El problema surge al actualizar los files de configuration. Por ejemplo, puede hacer esto como funciones 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" 

En este ejemplo, he anclado la expresión para que solo coincidan las líneas que no tienen text adicional. Pero supone que no hay metacaracteres en los datos. Esta llamada no agregaría su text literal:

 add_data program.conf ".*Line 2$" 

Podría solucionarlo escapando de los caracteres que pueden causar un problema con grep.

Los comentaristas señalan que uno puede evitar ese problema utilizando la opción POSIX -x :

Considere solo las líneas de input que usan todos los caracteres en la línea excluyendo la terminación para hacer coincidir una cadena fija completa o una expresión regular para que sean líneas coincidentes.

con 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$" 

Si pone solo esas líneas para agregar en un file como:

 Line 1 Line 2 

Podrías hacerlo:

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

Eso supone that-file no contiene \E y no termina en líneas vacías.