4

Я ищу приложение, которое будет различать два файла и фактически игнорировать все пробелы, например:

class foo { 
  bar
  spaz 
}

в равной степени эквивалентно

class foo{bar spaz}

или также

classfoo { 
  barspaz}

но нет

classfoo { 
  spazspaz
}

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

  • Это может быть утилита, совместимая с Windows или Linux / Unix / Posix
  • Я пробовал команду lin / unix diff -w , она пропускает только пробел, если разница в строке равна пробелу. Я не вижу возможности полностью игнорировать пробелы.
  • Я также попробовал UECompare или Ultracompare, несвободную утилиту сравнения для Windows.

2 ответа2

5

Вы ищете что-то вроде команды tr ? Вот manpages. Насколько я могу судить, он включен в инструменты msysgit , cygwin и gnuwin32 tools .

Таким образом, вы можете удалить все пустые места до начала различий, выполнив что-то вроде:

tr --delete '[:space:]' <filename.txt

Затем вы можете передать вывод этой команды в diff и заставить его работать без пробелов.

Например, у меня есть файл с именем HelloWorldApp.java . Позвольте мне показать вам, как tr обрабатывает это:

C:\temp>cat HelloWorldApp.java
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}
C:\temp>tr -d '[:space:]' <HelloWorldApp.java
classHelloWorldApp{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");//Displaythestring.}}
0

Несмотря на то, что он ориентирован на линии, diff можно сделать так, чтобы он запрашивал. Грубо говоря, вы можете сделать diff -w и затем обработать вывод diff. Он может посмотреть на вывод diff и соединить различные пары строк, чтобы увидеть, соответствуют ли они (сейчас) строке в другом файле.

Кажется, что это может быть O(n ^ 2) или другая неприятная вещь, но все равно было бы очень полезно, если бы оно ограничивало себя (скажем) отсутствием соединения, соединением 2 строк, соединением 3 строк в файле 1 X без объединения, объединением 2 строки, объедините 3 строки в файле 2 в движущемся "окне" вывода diff. (где X - ~ "перекрестное произведение")

Фактически, это похоже на работу, которую скрипт постобработки вывода Perl diff мог бы выполнить за несколько часов работы (в зависимости от вашего (Perl) навыка программирования)

Может быть, когда у меня есть какое-то задание, которое я не хочу делать на работе ... :-)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .