grep сопоставляет два файла и конвертирует их в нижний регистр

Мне нужен быстрый и эффективный подход к следующей проблеме (я работаю со многими файлами.) Но например:

У меня есть два файла: file2

Hello
Goodbye
Salut
Bonjour

и файл1

Hello, is it Me you're looking for?

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

Я могу grep слова в файле, выполнив:

grep -f file2.txt file1.txt

и возвращается

Hello

Так что теперь я хочу преобразовать в

hello

так что окончательный результат

hello, is it Me you're looking for?

Где, если я сопоставлю несколько файлов:

grep -f file2.txt *_infile.txt

Вывод будет сохранен в соответствующих отдельных файлах.

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

Благодарю.

1 ответ

Решение

Я бы решил проблему немного по-другому.

Во-первых, я бы отмечал спички в grep. --color=always работает хорошо, хотя это несколько громоздко и потенциально ненадежно при обнаружении. Тогда я бы поменял отмеченные совпадения на sed или же perl:

grep --color=always -F -f file2.txt file1.txt | \
    perl -p -e  's/\x1b.*?\[K(.*?)\x1b.*?\[K/\L\1/g'

Загадочный RE сопоставляет escape-последовательность окраски перед совпадением, de-color escape-последовательность сразу после совпадения и фиксирует все промежуточное в группе 1. Затем применяется строчная буква \L преобразование в плен. Вероятно, GNU sed может сделать то же самое, но, вероятно, Perl более переносим.

Другие вопросы по тегам