Если файлы отсортированы, стандартный инструмент для этого - comm
:
comm -2 file1 file2
Параметр -2
предназначен для подавления строк печати, уникальных для file2
.
Он не дает точный формат, который вы указали. Однако вы можете проанализировать его, чтобы получить такой результат, если хотите. (Стандартные инструменты и стандартные форматы обычно довольно хорошо продуманы.)
Должны быть более элегантные решения (возможно, grep -P
- одно из них?), Но вы можете использовать sed
] для имитации grep
и получения нужных строк в случаях, когда простого grep -o
недостаточно:
sed -nr 's/.*SYSTEM "..\/blah\/([^"]*).*/\1/p'
Это будет соответствовать всей строке, а затем полностью заменить ее с подстрокой, которую вы искали.
Команда grep печатает строки, содержащие совпадения. Независимо от того, какой шаблон вы используете для сопоставления части строки, grep печатает всю строку.
GNU grep, версия, включенная в Cygwin, имеет возможность отображать только ту часть строки, которая соответствует шаблону: -o
.
grep -o 'abc[0-9][^"]*' file1
Вы можете добавить \ b
в начало шаблона, чтобы соответствовать только после пробелов или знаков препинания, т.е. чтобы избежать совпадения /fooabc123.xyz
. Если вы хотите найти соответствие после /
или "
, в вывод будет включен знак препинания; этого можно избежать с помощью утверждения просмотра назад , которое является доступно в синтаксисе регулярных выражений Perl.
grep -o -P '(?<=[/"])abc[0-9][^"]*' file1