sed, elimina da MarkA fino a ma non include MarkB


1

Espressione in termini matematici, vorrei eliminare una regione di [MarkA,MarkB). Cioè, la cancellazione avviene proprio quando MarkAviene trovata la parola chiave , fino alla parola chiave MarkB, ma non includendo quella linea (la linea che include la MarkBparola chiave non viene toccata).

È possibile farlo in sed?

Di 'la mia MarkAa dire ^3, ed MarkBè 7,

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

Verrà 7cancellato ma voglio preservarlo.

Per essere più precisi, posso localizzare con precisione MarkA(ad es. ^3), Ma voglio cancellare fino al primo MarkB. Vale a dire,

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

è quello che sto cercando se la 7riga non viene eliminata.


Penso di capire cosa stai chiedendo, ma puoi fare un esempio concreto? Può essere composto, ma un input di esempio e l'output previsto.
blm


@choroba, quasi, ma voglio eliminarli ma preservare il resto. il tuo script li preserva ma elimina il resto.
xpt,

@xpt: ecco perché ho solo commentato, non risposto alla tua domanda.
Choroba,

Risposte:


2

Usando sed

Questo elimina l'intervallo fino a ma non includendo l'ultima riga nell'intervallo:

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

Come prima, /^3/,/7/seleziona l'intera gamma, incluso /7/. E, come prima, quell'intervallo viene eliminato con il dcomando. Tuttavia, prima di eliminare, controlliamo se la riga contiene /7/e, in tal caso, la stampiamo con il pcomando.

Usando awk

awk offre molta flessibilità. Qui, usiamo una variabile fcome flag per decidere se le linee devono essere stampate:

$ seq 9 | awk '/^3/{f=1} /7/{f=0} !f'
1
2
7
8
9
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.