sed, usuń z MarkA, ale nie włączaj MarkB

1

Wyrażenie w terminach matematycznych, chciałbym usunąć region [MarkA,MarkB). Oznacza to, że usunięcie następuje tuż po słowie kluczowym MarkA napotkane, aż do słowa kluczowego MarkB, ale bez tej linii (linia zawierająca MarkB słowo kluczowe pozostaje nietknięte).

Czy można to zrobić w sed?

Powiedz moje MarkA jest ^3, i MarkB jest 7,

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

Dostanie moje 7 usunięty, ale chcę go zachować.

Aby być bardziej precyzyjnym, mogę dokładnie zlokalizować MarkA (na przykład. ^3 ), ale chcę usunąć do pierwszego MarkB. To znaczy.,

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

jest czego szukam, jeśli 7 linia nie jest usuwana.

xpt
źródło
Myślę, że rozumiem, o co pytasz, ale czy możesz podać konkretny przykład? Można go skomponować, ale przykładowe wejście i oczekiwane wyjście.
blm
@choroba, prawie, ale chcę to zrobić kasować ale zachowaj resztę. twój skrypt zachowa je, ale usuń resztę.
xpt
@xpt: Dlatego tylko skomentowałem, nie odpowiedziałem na twoje pytanie.
choroba

Odpowiedzi:

2

Używanie sed

Spowoduje to usunięcie zakresu do, ale nie włącznie z ostatnim wierszem w zakresie:

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

Jak wcześniej, /^3/,/7/ wybiera cały zakres, włącznie z /7/. I tak jak poprzednio, zakres ten jest usuwany za pomocą d dowództwo. Zanim jednak usuniemy, sprawdzamy, czy linia zawiera /7/ iw takim przypadku drukujemy go za pomocą p dowództwo.

Używanie awk

awk oferuje dużą elastyczność. Tutaj używamy zmiennej f jako flaga, aby zdecydować, czy linie powinny być drukowane:

$ seq 9 | awk '/^3/{f=1} /7/{f=0} !f'
1
2
7
8
9
John1024
źródło