У меня есть два файла snmpd.conf, один на сервере, который работает, а другой - нет. Как я могу различать два файла конфигурации, удаляя ненужные комментарии и символы новой строки?
Если вам комфортно с vim, Я настоятельно рекомендую вам использовать vimdiff:
vimdiff file1 file2
Это откроет сеанс vim с двумя панелями, по одному файлу с каждой стороны. Выделение и цвет будут указывать на различия между файлами, и все идентичные части будут скрыты (сложены, но могут быть расширены).
Затем, если вы хотите выборочно объединить различия из одного файла в другой, вы можете использовать следующие команды:
(Считайте, что «текущий файл» - это тот, где находится курсор)
^ W ^ W для переключения фокуса с окна одного файла на окно другого файла
] c перейти к следующему блоку с отличиями
[c обратный поиск предыдущего блока с отличиями
делать (dесли только оbtain), чтобы перенести изменения из другого файла в текущий файл
дп (dесли только пut) для отправки изменений из текущего файла в другой файл
Примечание: оба делать и дп работать, если вы находитесь в блоке или только на одной строке под блоком.
ты к тыndo
зо развернуть / развернуть текст
zc повторно свернуть / скрыть текст
zr полностью развернет оба файла (используйте : help fold подробнее о складывании)
: diffupdate повторно просканирует файлы на предмет изменений
Когда вы начнете перемещать измененный текст или вносить изменения, теперь идентичные части файлов также автоматически сворачиваются.
Когда вы закончите, вы можете выйти и записать оба файла с помощью : xa!
Вы также можете записывать, закрывать, отменять изменения и т. Д. По одной панели за раз, как обычно с vim.
Вы можете использовать все стандартные команды vim для редактирования файлов по желанию; Я описал только наиболее распространенные и полезные команды, которые вы, вероятно, будете использовать в сеансе vimdiff (в отличие от обычного vim).
diff <(grep -v '^#' f1) <(grep -v '^#' f2)
Чтобы избежать пустых строк и строк, содержащих только пробелы, в дополнение к идентичным строкам, которые имеют единственное отличие добавленных ведущих пробелов ...
diff -b \
<(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\
<(grep -vE '^([ \t]*#|^[ \t]*$)' f2)
К этому моменту я бы, вероятно, поместил это в сценарий и написал что-то вроде исходного предложения, которое было бы немного более читабельным.
Beyond Compare - идеальный инструмент для этого!
Ссылка на сайт: http://www.scootersoftware.com/
Доступно для Windows и Linux.
Джефф недавно написал хорошую обзорную статью об этом инструменте:
http://www.codinghorror.com/blog/archives/000454.html
Расширяя однострочник nima, вы можете сделать это как функцию оболочки и поместить ее в свой .bashrc
diff <(grep -v '^#' f1) <(grep -v '^#' f2)
становится (используя -u, потому что мне нравятся унифицированные различия)
function cleandiff {
diff -u <(grep -v '^#' $1| grep -v '^ *$') <(grep -v '^#' $2 | grep -v '^ *$')
}
Если вам нравятся программы просмотра различий с графическим интерфейсом, то meld хорош и понимает каталоги / файлы с контролем версий.
После очистки комментариев я бы посоветовал использовать KDiff3, это довольно хороший инструмент сравнения / слияния, и вам не нужен vim fu для его использования :)
Возможно, есть более элегантный способ сделать это, но прагматично (и быстро):
grep -v '^#' server1-snmpd.conf | grep -v '^ *$' > server1-snmpd.conf-clean
grep -v '^#' server2-snmpd.conf | grep -v '^ *$' > server2-snmpd.conf-clean
diff server1-snmpd.conf-clean server2-snmpd.conf-clean
Если вы используете оболочку, похожую на bash, вы можете попробовать следующее:
# Name this diff-stripped
STRIPPED=
for i in $*; do
egrep -v "^#|^\s*" "$i" > "$i.stripped"
STRIPPED="$STRIPPED $i.stripped"
done
diff $STRIPPED
Затем вызовите его так:
diff-stripped file1 file2 ...
Вы также можете изменить diff
к vimdiff
или gvimdiff
которые оба идут с vim
.
Расширяя решение Xerxes, вы можете использовать более сложные инструменты, чем diff
для отображения различий.
wdiff
иногда может быть «слишком умным», но я часто нахожу его полезным для быстрого взгляда на различия между файлами конфигурации. Этот скрипт можно использовать для вывода с цветами:
#!/bin/bash
RED=$'\e'"[1;31m"
GREEN=$'\e'"[1;32m"
RESET=$'\e'"[0m"
WDIFF_ARGS="-w$RED -x$RESET -y$GREEN -z$RESET --avoid-wraps"
wdiff $WDIFF_ARGS \
<(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
<(grep -vE '^([ \t]*#|^[ \t]*$)' $2) \
| less -R
В Ubuntu и других системах на основе Debian просто apt-get install wdiff
перед использованием этого скрипта.
Meld - хорошая альтернатива графическому интерфейсу, но с его функцией «Фильтрация текста» есть некоторые проблемы. Вместо использования текстовой фильтрации я полностью удаляю комментарии перед показом результатов в Meld. Недостаток - потеря возможности редактировать файлы при их сравнении. Вот простой скрипт для использования Meld:
#!/bin/bash
meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
<(grep -vE '^([ \t]*#|^[ \t]*$)' $2)
Иногда несколько дополнительных общих строк могут быть удалены путем сортировки файлов до сравнения, поэтому я бы добавил к уже написанному следующее:
diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort)
это, конечно, имеет смысл для файлов, где порядок строк не влияет на его содержимое (так что имейте в виду).
Это то же самое, что и один лайнер nima, но также будет отфильтровывать пустые строки по запросу.
diff -u <(egrep -v '^(#| *$)' f1) <(egrep -v '^(#| *$)' f2)
(Я бы также установил colordiff, если возможно, и использовал его вместо обычного diff)
Я использую WinMerge http://winmerge.org чтобы различать файлы, если мне нужно загрузить их на свою машину, но это работает.