Stavo esaminando questa domanda e poi mi chiedevo come avrei potuto implementare la mia risposta che utilizza
sed
usando puramente
POSIX
ex
.
Il trucco è che mentre sed
riesco a confrontare lo spazio di mantenimento con lo spazio del modello per vedere se sono esattamente equivalenti (con
G;/^\(.*\)\n\1$/{do something}
), non so come fare un simile test ex
.
So che in Vim potrei Y
ankare la prima riga e quindi digitare
:2,$g/<C-r>0/d
per fare quasi quello che sto specificando, ma se la prima riga contiene altro che un testo alfanumerico molto semplice, questo diventa davvero un caso, dal momento che la riga viene scaricata come
regex , non solo una stringa per il confronto. (E se la prima riga contiene una barra, il resto della riga verrà interpretato come un comando!)
Quindi, se voglio eliminare tutte le righe myfile
identiche alla prima riga, ma non eliminare la prima riga, come potrei farlo usando ex
? Del resto, come potrei farlo usando vi
?
Esiste un modo POSIX per eliminare una riga se corrisponde esattamente a un'altra riga?
Forse qualcosa come questa sintassi immaginaria:
:2,$g/**lines equal to "0**/d
sed
come un filtro dall'interno ex
, ed eseguire tutta la mia sed
risposta su tutto il buffer di ..., che avrebbe funzionato, naturalmente (e in realtà è portatile a differenza sed -i
).
<C-r>0
molto buono. Non sono sicuro che potresti fare di meglio con solo i comandi Ex perché devi proteggere caratteri speciali. Senza il vincolo conforme a POSIX penso che useresti l'opzione molto nomagica \V
e quindi proteggeresti la barra rovesciata (perché mantiene il suo significato speciale anche con \V
) con la escape()
funzione il cui secondo argomento è una stringa contenente tutti i caratteri che vuoi scappare / proteggere .
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'
O potresti usare un altro carattere per il delimitatore di pattern come un punto e virgola. In questo caso non è necessario proteggere una barra in avanti nel modello. :execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sed
molto valido. Con Vim, spesso deleghi determinati compiti speciali ad altri programmi, ed sed
è probabilmente un buon esempio di ciò. A proposito, non è necessario eseguire sed
l'intero buffer. Se si desidera eseguirlo solo su una parte del buffer, è possibile fornire un intervallo. Per esempio, se si desidera filtrare solo le linee tra 50 e 100, è possibile digitare: :50,100!<your sed command>
.
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'