1

Выражение в математике, я хотел бы удалить область [MarkA,MarkB) . Т.е., удаление происходит сразу , когда ключевое слово встречается MarkA вплоть до ключевого слова MarkB но не включая эту линию (линия включая MarkB ключевое слово остается нетронутым).

Возможно ли это сделать в sed?

Скажи, что мой MarkA ^3 , а MarkB 7 ,

$ seq 9 | sed '/^3/,/7/d'
1
2
8
9

Это удалит мои 7 но я хочу сохранить это.

Чтобы быть более точным, я могу точно найти MarkA (например, ^3), но я хочу удалить до первого MarkB . То есть,

seq 19 | sed '/^3/,/7/d'

это то, что я ищу, если 7 строка не удалена.

1 ответ1

2

Используя sed

Это удаляет диапазон до, но не включая последнюю строку в диапазоне:

$ seq 9 | sed '/^3/,/7/{/7/p;d}'
1
2
7
8
9

Как и прежде, /^3/,/7/ выбирает весь диапазон, включая /7/ . И, как и прежде, этот диапазон удаляется командой d . Однако перед удалением мы проверяем, содержит ли строка /7/ и в этом случае мы печатаем ее с помощью команды p .

Использование awk

awk предлагает большую гибкость. Здесь мы используем переменную f в качестве флага, чтобы решить, следует ли печатать строки:

$ seq 9 | awk '/^3/{f=1} /7/{f=0} !f'
1
2
7
8
9

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .