Estaba mirando esta pregunta y luego me preguntaba cómo podría implementar mi respuesta, que usa
sed
puramente
POSIX
ex
.
El truco es que, si sed
bien puedo comparar el espacio de espera con el espacio del patrón para ver si son exactamente equivalentes (con
G;/^\(.*\)\n\1$/{do something}
), no conozco ninguna forma de hacer tal prueba ex
.
Sé que en Vim podría Y
marcar la primera línea y luego escribir
:2,$g/<C-r>0/d
para hacer casi lo que estoy especificando, pero si la primera línea contiene algo que no sea un texto alfanumérico muy directo, esto se convierte realmente en un cambio, ya que la línea se está volcando como una
expresión regular. , no solo una cadena para comparar. (¡Y si la primera línea contiene una barra diagonal, el resto de la línea se interpretará como un comando!)
Entonces, si deseo eliminar todas las líneas myfile
que son idénticas a la primera línea, pero no eliminar la primera línea, ¿cómo podría hacerlo usando ex
? Para el caso, ¿cómo podría hacerlo usando vi
?
¿Hay alguna forma POSIX de eliminar una línea si coincide exactamente con otra línea?
Quizás algo como esta sintaxis imaginaria:
:2,$g/**lines equal to "0**/d
sed
como un filtro desde adentro ex
y ejecutar toda mi sed
respuesta en todo el búfer ... lo que funcionaría, por supuesto (y en realidad es portátil a diferencia sed -i
).
<C-r>0
muy bueno. No estoy seguro de que pueda hacerlo mejor solo con los comandos Ex porque debe proteger los caracteres especiales. Sin la restricción compatible con POSIX, creo que usaría el interruptor muy nomagic \V
y luego protegería la barra invertida (porque mantiene su significado especial incluso con \V
) con la escape()
función cuyo segundo argumento es una cadena que contiene todos los caracteres que desea escapar / proteger .
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'
O podría usar otro carácter para el delimitador de patrón como un punto y coma. En este caso, no necesitaría proteger una barra diagonal en el patrón. Daría algo como::execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sed
también muy bueno. Con Vim, a menudo delega ciertas tareas especiales a otros programas, y sed
probablemente sea un buen ejemplo de eso. Por cierto, no tiene que ejecutar sed
todo su búfer. Si desea ejecutarlo solo en una parte del búfer, puede asignar un rango. Por ejemplo, si desea filtrar sólo las líneas entre 50 y 100, podría escribir: :50,100!<your sed command>
.
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'