Voy a enviar el formulario usando cURL, donde algunos de los contenidos provienen de otro archivo, seleccionado usando sed
Si param1
se usa un patrón de coincidencia de línea de otro archivo sed
, el siguiente comando funcionará bien:
curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit
Ahora ve al problema. Quiero mostrar solo texto entre 2 patrones coincidentes, excluyendo el patrón coincidente en sí.
Digamos que file.txt
contiene:
Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.
Actualmente, muchos comandos "entre 2 patrones coincidentes" sed
no se eliminarán firstmatch
y secondmatch
.
Quiero que el resultado sea:
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
text-processing
sed
lokomika
fuente
fuente
Respuestas:
Aquí hay una manera de hacerlo:
Explicó: A partir de la primera línea a la línea coincidente firstmatch , eliminar. Desde la línea que coincide con el segundo partido hasta la última línea, elimine.
fuente
En awk:
fuente
La otra
sed
solución fallará sifirstmatch
ocurre en la primera línea 1 .Que sea simple, use un rango único y una expresión regular vacía 2 :
imprima todo en ese rango, excepto los extremos del rango (impresión automática desactivada) 3 :
o, más corto, elimine todo lo que no esté en ese rango y también elimine los extremos del rango:
1: la razón es que si la segunda dirección es una expresión regular, entonces la comprobación de la coincidencia final comenzará con la línea que sigue a la línea que coincide con la primera dirección .
Por lo tanto,
/firstmatch/
nunca se evalúa para la primera línea de la entrada,sed
simplemente lo eliminará ya que coincide con el número de línea1,/RE/
y pasará a la segunda línea donde verifica si la línea coincide/firstpattern/
2: Cuando un Regex está vacío (es decir,
//
)sed
se comporta como si la última Regex utilizado en el último comando aplicado (ya sea como una dirección o como parte de un comando sustituto) fue especificado.3: la
;}
sintaxis es parased
implementaciones modernas ; con los más antiguos, use una nueva línea en lugar del punto y coma o expresiones separadas, por ejemplosed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile
fuente
//
está haciendo (dentro de{…}
)?//
significa la última expresión regular utilizada; de todo lo que he leído, eso debería ser/secondmatch/
. A través de las pruebas verifiqué que su comando funciona, por lo que he concluido que funciona como/firstmatch|secondmatch/
(lo cual ha confirmado), pero no puedo encontrar ninguna documentación (ni siquiera el documento POSIX al que se vinculó o el GNU sed manual ) que describe este comportamiento. … (Continúa)sed
: (1) Si lo hago/first/,4
, entonces//
actúa como/first/
. (2) Si lo hago2,/second/
,//
aparece el error "sin expresión regular previa". (Encuentro que esto es un fracaso evidente para seguir el comportamiento especificado.) (3) Agregar--posix
no cambia ninguno de los anteriores. (II) En otros programas: (4) Envi
, después/first/,/second/
,//
actúa como/second/
(y las otras formas también son implementaciones racionales de la regla documentada). … (Continúa)awk
parece no tener noción de "el último ER usado";//
se refiere al no carácter antes o después de cualquier carácter. (Te invito a que lo pruebesecho -- | awk '{ gsub(//, "cha"); print }'
.)/first|second/
. Eres afortunado. Menciono los otros programas para demostrar que esta no es una convención de expresiones regulares en todo el sistema. Quien lo haya agregadosed
no se molestó en agregarlovim
, donde habría tenido tanto sentido. :-)