Удалить строки, соответствующие нескольким шаблонам, из списка

У меня есть файл со строками:

1
apple
2
orange
3
banana
4
mango
5
coconut

У меня есть список шаблонов:

1
3
5

Я хочу удалите строки (и одну дополнительную строку после), используя список шаблонов, чтобы получить:

2
orange
4
mango

Поскольку у меня есть большое количество шаблонов, которые я не мог ввести вручную один за другим в одной команде, список должен быть использовал.

0
13.07.2017, 12:54
2 ответа

sed+пастараствор:

sed -E "/\<(`paste -s -d'|' patterns`)\>/{N;d;}" file

Выход:

2
orange
4
mango

  • paste -s -d'|' patterns-объединить строки файла patterns, используя |в качестве разделителя, чтобы получить группу чередования регулярных выражений(1|3|5)

  • N-добавить следующую строку в пространство шаблонов

  • d-удалить строки пространства шаблона

1
28.01.2020, 04:43

Давайте поработаем grepс вариантами:

Вы можете grepисключить все строки в вашем файле фруктов, кроме тех, которые находятся в вашем файле списка с номерами:

grep -v -x -f numbers fruits

(-fдля получения файла шаблона, -xдля предотвращения частичного совпадения и -vдля инвертирования совпадения)

К сожалению, числа и фрукты находятся в разных строках, поэтому фрукты переживают grep. Избавимся от них дополнительным -eпаттерном:

grep -v -x -e "[a-z]*" -f numbers fruits

Теперь все строки, состоящие только из букв, удалены, так что фруктов больше нет, даже нужных. Но мы можем восстановить их из контекста :

.
grep -v -x -A1 -e "[a-z]*" -f numbers fruits

(-A1дает дополнительную строку после каждого совпадения )наконец дает то, что вы хотели.

0
28.01.2020, 04:43

Теги

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