Считайте, что у меня есть два текстовых файла.

Имя первого файла - «Emails.txt» со следующими данными:

sale@gmail.com
info@yahoo.com
all@gmail.com
help@domain.com
abcdsale@gmail.com
abcd.info@yahoo.com

Второй текстовый файл - «Roles.txt» со следующими строками:

sale@
info@
all@
help@

Как удалить все строки в первом текстовом файле "Emails.txt", если он соответствует ТОЛЬКО ТОЧНЫМ строкам любой строки, присутствующей во втором текстовом файле "Role.txt"?

Желаемый вывод нового файла должен быть:

abcdsale@gmail.com
abcd.info@yahoo.com

Я пытался с помощью

grep -vf Role.txt Emails.txt

Но эта команда также удаляет строку, если она соответствует всем символам Role.txt.

Я хочу удалить только то, что соответствует EXACT в соответствии с файлом Role.txt, и провести все, если есть другие символы перед желаемой строкой.

Здесь кто-то дал аналогичное решение для удаления строки, совпадающей со строкой EXACT в конце каждой строки, но в этом мне нужно использовать regrex для того же самого в начале каждой строки.

1 ответ1

2

Второй файл должен выглядеть так:

^sale@
^info@
^all@
^help@

потому что ^ соответствует началу строки.

Вы можете перестроить файл с помощью sed -i 's/^/^/' Role.txt . Чтобы было понятно: это изменит файл. Тогда ваша оригинальная команда

grep -vf Role.txt Emails.txt

буду работать.


В качестве альтернативы, с вашим оригинальным Role.txt , в оболочке, которая поддерживает подстановку процессов (например, Bash):

grep -vf <(sed 's/^/^/' Role.txt) Emails.txt

В этом случае sed добавляет символы ^ на лету, а Role.txt остается неизменным.

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