Как я могу удалить несколько строк из файла на основе шаблона, который занимает несколько строк? - PullRequest
1 голос
/ 05 февраля 2020

У меня есть текст в следующем формате:

2020-05-02
apple
string
string
string
string
string
2020-05-03
pear
string
string
string
string
string
2020-05-03
apple
string
string
string
string
string

В каждой группе есть 7 строк = Дата, Фрукты, а затем 5 строк.

Я хотел бы удалить группы 7 строк из файла с указанием только даты и фруктов.

Поэтому, если выбрать '2020-05-03' и 'pear'

, это приведет к удалению:

2020-05-03
pear
string
string
string
string
string

из файла, в результате чего:

2020-05-02
apple
string
string
string
string
string
2020-05-03
apple
string
string
string
string
string

Файл содержит тысячи строк, мне нужна команда, вероятно, с использованием sed или awk для:

  1. Поиск для даты 2020-05-03

  2. Проверить, если строка после даты pear

  3. удалить обе строки и следующие 5 строки

Я знаю, что могу удалить с помощью sed, например sed s'/string//g', но я не уверен, что могу удалить несколько строк.

Примечание: дата, за которой следуют фрукты, никогда не повторяется дважды, поэтому

2020-05-02
pear

встречается в файле только один раз

Как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

Используя awk,, вы можете сделать это:

awk -v dt='2020-05-03' -v ft='pear' '$1==dt{p=NR} p && NR==p+1{del=($1==ft)}
del && NR<=p+6{next} 1' file

2020-05-02
apple
string
string
string
string
string
2020-05-03
apple
string
string
string
string
string

Объяснение:

  • -v dt='2020-05-03' -v ft='pear' : Введите 2 значения в awk из командной строки
  • $1==dt{p=NR}: Если мы находим строку с соответствующей датой, сохраняем строку № в переменной p
  • p && NR==p+1{del=($1==ft)}: Если p>0 и мы находимся на следующей строке, затем устанавливаем флаг del на 1, если у нас совпадает название фрукта, в противном случае устанавливаем этот флаг на 0.
  • del && NR<=p+6{next}: если установлен флаг del, то пропустить следующие 6 строк
  • 1: действие по умолчанию для печати строки
0 голосов
/ 09 февраля 2020

Это может сработать для вас (GNU sed):

sed '/2020-05-03/{:a;N;s/[^\n]*/&/7;Ta;/^[^\n]*\npear/d}' file

Если строка содержит 2020-05-03, собрать в общей сложности 7 строк, а если вторая из этих строк содержит pear, удалить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...