Tres sed
comandos 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 sed
s 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 N
comando ext para agregar la siguiente línea de entrada al espacio de patrón siguiendo un \n
carácter de línea de flujo. Cualquiera que haya estado sed
ingiriendo durante un tiempo habrá aprendido a confiar en el \n
personaje 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; sed
actú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;D
bucle muy simple . Estos tres comandos están integrados en cualquier compatible con POSIX sed
y se complementan muy bien entre sí.
N
- como ya se mencionó, agrega la N
línea de entrada ext al espacio de patrón después de un \n
delimitador de línea e insertado .
P
- como p
; que P
Rints patrón espacio - pero sólo hasta a la primera que ocurre \n
carácter ewline. Y así, dada la siguiente entrada / comando:
printf %s\\n one two | sed '$!N;P;d'
sed
P
rints solo uno . Sin embargo, con ...
D
- como d
; que D
eletes patrón-espacio y comienza otro ciclo-line. A diferencia d
, D
elimina solo hasta la primera línea de \n
flujo que ocurre en el espacio de patrones. Si hay más en el espacio de patrón después del \n
carácter de línea ew, sed
comienza el siguiente ciclo de línea con lo que queda. Si d
en el ejemplo anterior se reemplazara con a D
, por ejemplo, sed
se P
borrarí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 \n
ew añadida N
, nunca queda nada cuando se sed
D
elige el espacio de patrón.
Se podrían hacer pruebas para aplicar el P
y / o D
selectivamente, 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 :b
rancho / t
est (como también se demuestra en la respuesta de Joeseph R. aquí ) y vuelven a ella dadas ciertas condiciones.
-e :n -e
- los sed
scripts portátiles delimitarán una :
definición de etiqueta con un \n
ewline o una nueva -e
declaración de ejecución en línea .
:n
- define una etiqueta llamada n
. Esto se puede devolver en cualquier momento con bn
o tn
.
tn
- el t
comando 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ó t
ests fue exitosa.
En este comando, la recursión ocurre para las líneas coincidentes. Si sed
reemplaza con éxito el patrón con otros caracteres , sed
vuelve a la :n
etiqueta e intenta nuevamente. Si s///
no se realiza una sed
sustitució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 sed
la prueba. Debido a que el b
comando ranch es una función de esta dirección, sed
solo b
regresará a ranch :n
después de que se \n
agregue un ewline y el espacio de patrón todavía termine con una "
comilla doble.
Se hace el menor tiempo posible entre N
y b
, de esta manera, se sed
puede 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 g
bandera lobal, por lo que hará todos los reemplazos necesarios a la vez. Dada una entrada idéntica, este comando sale idénticamente al último.
\n
declaració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ássed
rechazarán ese escape en el lado derecho. aún así, el\n
escape funcionará a la izquierda en cualquier POSIXsed
y puede traducirlos de forma portátil comoy/c/\n/
si tuviera el mismo efectos/c/\n/g
y no siempre es tan útil.