sed - удаляет строки с шаблонами из внешнего файла

359
faceless

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

Скажем, у меня есть текстовый файл с:

Adam Belle Candy Donald Eve 

И pattern.file имеет:

Don* Candy 

При этом grep -fv pattern.file text.fileя получаю именно то, что хочу, но только с учетом:

Adam Belle Eve 

Я не могу перенаправить отфильтрованный вывод в новый файл. Поэтому мне нужен способ, чтобы иметь возможность изменить исходный text.file, удалив все строки, которые соответствуют шаблону (ам) из внешнего файла.

В моем реальном случае использования text.file содержит не алфавитный порядок, не всегда с заглавной буквы, поэтому создание общего регулярного выражения для sed невозможно.

Как лучше всего передать шаблоны для удаления строк из внешнего файла?

1
Почему вы не можете перенаправить вывод в новый файл? Во всяком случае, `sed -i` создает новый файл за кулисами. choroba 5 лет назад 0
@choroba - потеря привилегий. Можно только изменить faceless 5 лет назад 0
Так что, может быть, `sponge`, чтобы перенаправить вывод в * тот же * файл. Kamil Maciorowski 5 лет назад 1
Это может сработать: `grep -vf pattern.file text.file> foo; cp foo text.file & rm foo` Cyrus 5 лет назад 1

1 ответ на вопрос

1
Cyrus

С GNU sed и bash:

sed -i -f <(sed 's|.*|/&/d|' pattern.file) text.file 
Такого рода работы, но не обязательно по правильным причинам. (1) Он выполняет поиск без привязки, поэтому, если файл шаблона содержит «Alex», он удалит «Alexander» и «Alexandra» из текстового файла. (2) Ожидается, что шаблоны будут регулярными выражениями. Это не похоже на то, что задумал ОП. Например, * для данного файла шаблона, * "Douglass" будет удален, потому что `Don *` соответствует любой строке, содержащей `Do`. (Если за ним следует строка из `n`, это не имеет значения.) (3) Пользователь должен быть предупрежден о том, что, если файл шаблона содержит косые черты (` / `), это не удастся. Scott 5 лет назад 0
Спасибо @Cyrus, это то, что я искал! Скотт, спасибо, предоставленный ответ подходит для моего конкретного шаблона управления, но я буду принимать во внимание ваши заметки. faceless 5 лет назад 0

Похожие вопросы