Tres sedcomandos diferentes :
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
Los tres se basan en el s///comando básico de sustitución:
s/"[^"]*"\n<[^>]*>/other characters /
También todos intentan tener cuidado en el manejo de la última línea, ya que los seds tienden a diferir en su salida en casos extremos. Este es el significado de $!una dirección que coincide con cada línea que !no es la $última.
También usan el Ncomando ext para agregar la siguiente línea de entrada al espacio de patrón siguiendo un \ncarácter de línea de flujo. Cualquiera que haya estado sedingiriendo durante un tiempo habrá aprendido a confiar en el \npersonaje ewline, porque la única forma de obtener uno es ponerlo explícitamente allí.
Los tres intentan leer con la menor cantidad de información posible antes de tomar medidas; sedactúa tan pronto como sea posible y no necesita leer un archivo de entrada completo antes de hacerlo.
Aunque lo hacen todo N, los tres difieren en sus métodos de recursión.
Primer comando
El primer comando emplea un N;P;Dbucle muy simple . Estos tres comandos están integrados en cualquier compatible con POSIX sedy se complementan muy bien entre sí.
N- como ya se mencionó, agrega la Nlínea de entrada ext al espacio de patrón después de un \ndelimitador de línea e insertado .
P- como p; que PRints patrón espacio - pero sólo hasta a la primera que ocurre \ncarácter ewline. Y así, dada la siguiente entrada / comando:
printf %s\\n one two | sed '$!N;P;d'
sed Prints solo uno . Sin embargo, con ...
D- como d; que Deletes patrón-espacio y comienza otro ciclo-line. A diferencia d , Delimina solo hasta la primera línea de \nflujo que ocurre en el espacio de patrones. Si hay más en el espacio de patrón después del \ncarácter de línea ew, sedcomienza el siguiente ciclo de línea con lo que queda. Si den el ejemplo anterior se reemplazara con a D, por ejemplo, sedse Pborraría uno y dos .
Este comando solo se repite para las líneas que no coinciden con la s///instrucción de sustitución. Debido a que la s///sustitución elimina la línea de \new añadida N, nunca queda nada cuando se sed Delige el espacio de patrón.
Se podrían hacer pruebas para aplicar el Py / o Dselectivamente, pero hay otros comandos que se ajustan mejor a esa estrategia. Debido a que la recursividad se implementa para manejar líneas consecutivas que coinciden solo con una parte de la regla de reemplazo, las secuencias consecutivas de líneas que coinciden con ambos extremos de la s///sustitución no funcionan bien .:
Dada esta entrada:
first "line"
<second>"line"
<second>"line"
<second>line and so on
... imprime ...
first other characters "line"
<second>other characters line and so on
Sin embargo, maneja
first "line"
second "line"
<second>line
... bien.
Segundo comando
Este comando es muy similar al tercero. Ambos emplean una etiqueta de :brancho / test (como también se demuestra en la respuesta de Joeseph R. aquí ) y vuelven a ella dadas ciertas condiciones.
-e :n -e- los sedscripts portátiles delimitarán una :definición de etiqueta con un \newline o una nueva -edeclaración de ejecución en línea .
:n- define una etiqueta llamada n. Esto se puede devolver en cualquier momento con bno tn.
tn- el tcomando est regresa a una etiqueta especificada (o, si no se proporciona ninguna, abandona el script para el ciclo de línea actual) si alguna s///sustitución desde que se definió la etiqueta o desde la última vez que se llamó tests fue exitosa.
En este comando, la recursión ocurre para las líneas coincidentes. Si sedreemplaza con éxito el patrón con otros caracteres , sedvuelve a la :netiqueta e intenta nuevamente. Si s///no se realiza una sedsustitución, imprime automáticamente el espacio de patrón y comienza el siguiente ciclo de línea.
Esto tiende a manejar mejor las secuencias consecutivas. Donde falló el último, esto imprime:
first other characters other characters other characters line and so on
Tercer Comando
Como se mencionó, la lógica aquí es muy similar a la anterior, pero la prueba es más explícita.
/"$/bn- Esta es sedla prueba. Debido a que el bcomando ranch es una función de esta dirección, sedsolo bregresará a ranch :ndespués de que se \nagregue un ewline y el espacio de patrón todavía termine con una "comilla doble.
Se hace el menor tiempo posible entre Ny b, de esta manera, se sedpuede recopilar rápidamente la mayor cantidad de información necesaria para garantizar que la siguiente línea no coincida con su regla. La s///ubicación difiere aquí en que emplea la gbandera lobal, por lo que hará todos los reemplazos necesarios a la vez. Dada una entrada idéntica, este comando sale idénticamente al último.
\ndeclaración de ewline que haces es por eso que pregunto. las personas rara vez preguntan si pueden hacer lo mismos//\n/que usted con GNUsed, aunque la mayoría de los demássedrechazarán ese escape en el lado derecho. aún así, el\nescape funcionará a la izquierda en cualquier POSIXsedy puede traducirlos de forma portátil comoy/c/\n/si tuviera el mismo efectos/c/\n/gy no siempre es tan útil.