diff для отображения только дополнений в измененном файле

Vuestro entendimiento es en parte correcto, pero sólo en parte. Una cosa que te falta para entender esto es cómo se usa la configuración regional. La configuración regional es utilizada por varias funciones de biblioteca que realizan acciones dependientes de la configuración regional -, como traducir mensajes (que usa LC_MESSAGES), formatear números(LC_NUMERIC)y fechas (LC_TIME, codificar y decodificar texto (LC_CTYPE), ordenar texto (LC_COLLATE), etc

Tomemos como ejemplo una función que da formato a una fecha. Si se le pide que use un formato dependiente de la configuración regional -, buscará las reglas para el formato de fecha en la configuración regional que se configuró para usar en el proceso actual. El formateo de la fecha no se preocupa por el nombre de un lugar, lo que necesita saber es cómo formatear la fecha. Entonces, si bien se ve en lo que podría llamar una "tabla de configuración regional", esta tabla no contiene nombres (, p. LC_TIMEesfr_FR)pero la configuración (, p. “el formato de fecha corta usa el orden día -mes -año, el formato de fecha larga usa los nombres de mes janvier, février, …” ).

La ​​función C setlocalecompleta algunas entradas en la tabla de configuración local del proceso. Se necesitan dos argumentos :una categoría para completar y una cadena que es un nombre dado a un valor particular para esta configuración regional. La cadena es básicamente un nombre de archivo desde el que cargar la configuración. Por ejemplo, setlocale(LC_TIME, "fr_FR")básicamente significa "cargar la configuración de formato de fecha en la tabla de configuración regional del proceso desde el archivo /usr/share/i18n/locales/fr_FR" (es más complicado que eso, hay otros archivos involucrados, pero esa es la idea básica ).

La función C setlocaletiene un modo de operación donde buscará variables de entorno. Si le da una cadena vacía en lugar de un nombre,determinará un nombre de configuración regional basado en la jerarquía de variables de entorno de configuración regional . Este modo es el que usan la mayoría de los programas. Una vez más, las variables de entorno y los nombres de la configuración regional influyen en cómo funciona setlocale, no en cómo funcionan las funciones que realizan acciones dependientes de la configuración regional -.

La tabla de configuración local es una característica de la biblioteca estándar(libc)con la que casi todos los programas están vinculados (independientemente del idioma (s )en el que están escritos ). La mayoría de los idiomas proporcionan una forma de configurarlo llamando a la función setlocalede la biblioteca estándar. Por ejemplo, Perl y Python tienen una función setlocaleque se parece a la de C. Los idiomas de alto nivel -también suelen tener una forma de establecer la configuración regional según el entorno, por ejemplo use localeen Perl; en bash es automático, pero la configuración regional no se basa en el entorno sino en las variables de shell del mismo nombre (, por lo que la configuración, p. LC_COLLATEtiene un efecto en bash incluso si no export).

7
14.09.2017, 16:52
4 ответа

Вы можете использовать --word-diff, чтобы сжать строки +и -вместе с изменениями, выделенными красным/зеленым текстом, и полностью прекратить использование команды grep.

enter image description here

Вы можете комбинировать это с -U0, чтобы удалить весь контекст вокруг различий, если вы действительно хотите сжать его еще больше.

enter image description here

Этот подход лучше, чем использование grep, так как вы не теряете вывод, вы можете сказать, когда строка была добавлена ​​или просто изменена, и вы не полностью теряете удаления, но при этом сжимаете вывод в нечто легко читаемое..

Ответ на вопрос о egrep уже дан @Stephen Kitt здесь

9
27.01.2020, 20:16

При использовании grepработает, вы можете использовать флаг для достижения аналогичного и, возможно, более лаконичного результата.


git diff

Вы можете настроить объем контекста, который git diffпредоставляет с помощью флага -U. Изman git-diff:

   -U<n>, --unified=<n>
       Generate diffs with <n> lines of context instead of the usual three. Implies -p.

git diff -U0будет производить минимальный/простой вывод без контекста для каждого изменения.


diff

Тот же флаг применяется кdiff:

   -u  -U NUM  --unified[=NUM]
          Output NUM (default 3) lines of unified context.

Пример(diff -U0будет работать так же):

$ diff -U0 <(echo -e "abc123\ndef345") <(echo -e "abc123\nghi678")
--- /dev/fd/63  2017-09-14 09:18:01.000000000 -0400
+++ /dev/fd/62  2017-09-14 09:18:01.000000000 -0400
@@ -2 +2 @@
-def345
+ghi678
2
27.01.2020, 20:16

Можно также выполнить только с помощью grep.

$ grep -xvFf filea.txt fileb.txt

Это берет строки из одного файла и ищет их в другом, распечатывая только те, которые точно не совпадают.

1
27.01.2020, 20:16

Ниже показано git diff, отображающее только измененные линии с сохранением цвета.

git diff file1.txt file2.txt --word-diff --color=always | grep -P '\+|\-' --color=never

0
14.11.2021, 08:38

Теги

Похожие вопросы