Удалить из совпадения с образцом до следующего рисунка - PullRequest
0 голосов
/ 30 января 2019

Из bash у меня есть входной файл с различными ключевыми словами, а иногда и данными в следующих строках.Я хотел бы удалить ключевые слова, начиная с PATTERN1, и не включая строки, начинающиеся с PATTERN2.Примечание:

  • будет несколько выражений, поэтому опция -e
  • Может быть несколько строк перед следующим *

I 'мы пробовали sed, например

sed -i.bak -e '/*FOO/,/*/d' -e '/*BAR/,/*/d $FILE

, но это удаляет строку *KEEP.

**START
*FOO
This wants to be deleted
*KEEP
*BAR
this also wants to be deleted
*KEEP
**END

должно стать

**START
*KEEP
*KEEP
**END

Заранее спасибо за просмотр этоговопрос

Ответы [ 2 ]

0 голосов
/ 31 января 2019

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

sed '/^*/h;G;/^*\(FOO\|BAR\)/M!P;d' file

Сохраните каждый ключ в том виде, в котором он представлен, в поле удержания и добавьте его к текущей строке.Выведите первую из двух строк в пространстве шаблона, если ни одна из них не содержит строки, начинающейся *FOO или *BAR.

0 голосов
/ 30 января 2019

Это проще сделать, используя awk:

awk '/^*/{d = 0} /^*(FOO|BAR)/{d = 1} !d' file

*START
*KEEP
*KEEP
**END

Если вы используете gnu awk, используйте -i inplace для сохранения изменений в строке:

awk -i inplace '/^*/{d = 0} /\*(FOO|BAR)/{d = 1} !d' file

Если не использовать gnu awk, используйте:

awk '/^*/{d = 0} /^*(FOO|BAR)/{d = 1} !d' file > $$.tmp && mv file $$.tmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...