Удалить из второго вхождения блок шаблона - PullRequest
0 голосов
/ 24 мая 2018

Каждая строка, начинающаяся с «File:» и «Modify:»
Мне нужно удалить из второго экземпляра шаблона «Modify» в блоках строк «Modify».
Сохранение первого вхождения «Modify»"в каждом" блоке модификации "

На основе этого текста

  File: /Music/David Bowe/1.mp3
Modify: 2010-11-24 09:36:33.000000000 -0200
Modify: 2016-04-13 11:32:58.692458900 -0300
  File: /Music/Music/David Bowe/Tom.mp3
Modify: 2010-10-22 11:12:15.000000000 -0200
  File: /Music/Music/David Bowe/Hero.mp3
Modify: 2010-10-26 07:21:56.000000000 -0200
Modify: 2017-04-13 11:32:58.282458400 -0300
  File: /Music/Music/David Bowe/AbsoluteBeginners.mp3
Modify: 2010-10-22 11:12:07.000000000 -0200
  File: /Music/Music/David Bowe/ImAfraidOfAmericans.mp3
Modify: 2011-11-13 08:54:57.000000000 -0200
Modify: 2015-04-13 11:32:58.732459000 -0300
Modify: 2016-04-13 11:32:58.692458900 -0300
Modify: 2016-01-01 21:18:53.348891500 -0200

Я хочу получить этот результат

  File: /Music/David Bowe/1.mp3
Modify: 2010-11-24 09:36:33.000000000 -0200
  File: /Music/Music/David Bowe/Tom.mp3
Modify: 2010-10-22 11:12:15.000000000 -0200
  File: /Music/Music/David Bowe/Hero.mp3
Modify: 2010-10-26 07:21:56.000000000 -0200
  File: /Music/Music/David Bowe/AbsoluteBeginners.mp3
Modify: 2010-10-22 11:12:07.000000000 -0200
  File: /Music/Music/David Bowe/ImAfraidOfAmericans.mp3
Modify: 2011-11-13 08:54:57.000000000 -0200

sed '/^Modify:/d' sample.txt не работает, потому что я удаляювсе вхождения шаблона.

sed '/^Modify:/2,$d' sample.txt попытка удаления со 2-го по последнее вхождение не работает снова (синтаксическая ошибка)

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

С GNU sed:

sed -n '/File:/N; /File:/p'  file

или короче:

sed -n '/File:/{N;p}' file

Выход:

  File: /Music/David Bowe/1.mp3
Modify: 2010-11-24 09:36:33.000000000 -0200
  File: /Music/Music/David Bowe/Tom.mp3
Modify: 2010-10-22 11:12:15.000000000 -0200
  File: /Music/Music/David Bowe/Hero.mp3
Modify: 2010-10-26 07:21:56.000000000 -0200
  File: /Music/Music/David Bowe/AbsoluteBeginners.mp3
Modify: 2010-10-22 11:12:07.000000000 -0200
  File: /Music/Music/David Bowe/ImAfraidOfAmericans.mp3
Modify: 2011-11-13 08:54:57.000000000 -0200

От man sed:

Опция:

-n: отключить автоматическую печать пространства шаблона

Команды:

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

p: печать текущего пространства шаблона.

0 голосов
/ 26 мая 2018

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

sed -n '/File/,/Modify/p' file

Отключить seds normal print-каждую строку и печатать только, когда указано.Выведите диапазон строк от File до Modify, все остальные строки не будут напечатаны.

Более надежное решение:

sed -n '/^  File:/{N;/^Modify:/M!D;p}' file

Используйте -n grep-likeвариант.Совпадение с конкретной строкой File:, добавление следующей строки и сопоставление с конкретной строкой Modify:, и если совпадение не найдено, удалите первую строку и повторите, в противном случае выведите обе строки и повторите.

NB При удалении первой строки, нормальная обработка семян не сопровождается.Поскольку пространство шаблона не является пустым, следующая строка автоматически не читается, и цикл команд начинается так, как если бы он уже был прочитан, то есть вторая строка, которая была добавлена ​​с помощью команды N, теперь становится первой строкой в ​​пространстве шаблона ипервая команда, которая будет выполнена, является /^ File:/.

0 голосов
/ 24 мая 2018

Вы можете использовать grep:

$ cat > trash.txt
  File: /Music/David Bowe/1.mp3
Modify: 2010-11-24 09:36:33.000000000 -0200
Modify: 2016-04-13 11:32:58.692458900 -0300
  File: /Music/Music/David Bowe/Tom.mp3
Modify: 2010-10-22 11:12:15.000000000 -0200
  File: /Music/Music/David Bowe/Hero.mp3
Modify: 2010-10-26 07:21:56.000000000 -0200
Modify: 2017-04-13 11:32:58.282458400 -0300
  File: /Music/Music/David Bowe/AbsoluteBeginners.mp3
Modify: 2010-10-22 11:12:07.000000000 -0200
  File: /Music/Music/David Bowe/ImAfraidOfAmericans.mp3
Modify: 2011-11-13 08:54:57.000000000 -0200
Modify: 2015-04-13 11:32:58.732459000 -0300
Modify: 2016-04-13 11:32:58.692458900 -0300
Modify: 2016-01-01 21:18:53.348891500 -0200
^D

$ grep File -A 1 trash.txt | grep -v -- --
  File: /Music/David Bowe/1.mp3
Modify: 2010-11-24 09:36:33.000000000 -0200
  File: /Music/Music/David Bowe/Tom.mp3
Modify: 2010-10-22 11:12:15.000000000 -0200
  File: /Music/Music/David Bowe/Hero.mp3
Modify: 2010-10-26 07:21:56.000000000 -0200
  File: /Music/Music/David Bowe/AbsoluteBeginners.mp3
Modify: 2010-10-22 11:12:07.000000000 -0200
  File: /Music/Music/David Bowe/ImAfraidOfAmericans.mp3
Modify: 2011-11-13 08:54:57.000000000 -0200

Объяснение:

  • -A 1 означает 1 строку контекста после совпадения (строки с File:)
  • | grep -v -- -- это удаление строк с -- (флаг -A ставит строку -- для маркировки разделителей групп), поэтому нам нужен второй grep: -v означает «сопоставлять только строки без этого шаблона»"а мы, первый --, просто избегаем второго --, потому что -- имеет особое значение для большинства утилит командной строки gnu
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...