У меня есть файл со строками:
1
apple
2
orange
3
banana
4
mango
5
coconut
У меня есть список шаблонов:
1
3
5
Я хочу удалите строки (и одну дополнительную строку после), используя список шаблонов, чтобы получить:
2
orange
4
mango
Поскольку у меня есть большое количество шаблонов, которые я не мог ввести вручную один за другим в одной команде, список должен быть использовал.
sed+пастараствор:
sed -E "/\<(`paste -s -d'|' patterns`)\>/{N;d;}" file
Выход:
2
orange
4
mango
paste -s -d'|' patterns
-объединить строки файла patterns
, используя |
в качестве разделителя, чтобы получить группу чередования регулярных выражений(1|3|5)
N
-добавить следующую строку в пространство шаблонов
d
-удалить строки пространства шаблона
Давайте поработаем 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
дает дополнительную строку после каждого совпадения )наконец дает то, что вы хотели.