En el siguiente archivo:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut eu metus id lectus vestibulum ultrices. Maecenas rhoncus.
Quiero eliminar todo antes consectetuer
y todo después elit
.
Mi salida deseada:
consectetuer adipiscing elit.
¿Cómo puedo hacer esto?
shell-script
text-processing
manuel
fuente
fuente
sed
. También puede serperl
, o incluso puro golpe.Respuestas:
Usaría sed
Decodificó el sed s / find / replace / syntax:
s/^.*
- sustituto comenzando por el principio de la línea (^
) seguido de cualquier cosa (.*
) hasta ...\(
- iniciar un bloque con nombreconsectetuer.*elit\.
- coincide con la primera palabra, todo (.*
) hasta la última palabra (en este caso, incluido el punto final (escapado)) que desea hacer coincidir\)
- finalizar el bloque nombrado.*
) hasta el final de la línea ($
)/
- finaliza la sección de búsqueda de sustitutos\1
- reemplazar con el bloque de nombre entre el\(
y el\)
anterior/
- finalizar el reemplazofuente
^
o$
ya que sed intentará encontrar la coincidencia más larga. También es posible que haya perdido el punto despuéselit
, puede insertarlo\.
si es necesario.^
y$
no son necesarios - Los dejé allí para que el interrogador señaló (originalmente) que era un poco de un principiante y esto puede ser útil en otros contextos.Si cada línea contiene tanto el patrón inicial como el final, entonces la forma más fácil de hacerlo es con
grep
. En lugar de eliminar el comienzo y el final de cada línea, simplemente puede generar el contenido entre ambos patrones. La-o
opción en GNUgrep
solo genera las coincidencias:Nota: como se mencionó, esto solo funciona si cada línea del archivo se puede analizar de esta manera. Por otra parte, eso es el 80% de todos los casos de uso típicos.
fuente
Dos para bucles en AWK:
Gsub de AWK:
fuente
A la manera de Perl. Esto es esencialmente lo mismo que la
sed
respuesta de MikeV :Los
-p
medios "imprimen cada línea después de aplicar la secuencia de comandos dada con-e
". Els/foo/bar/
es el operador de sustitución; se reemplazaráfoo
conbar
. Los paréntesis capturan un patrón y nos permiten usarlo en el reemplazo. El primer patrón capturado es$1
, el segundo$2
y así sucesivamente.Entonces, el comando hará coincidir todo hasta
consectetuer
(.*consectetuer
), luego todo hastaelit
(.*elit
) y luego todo lo demás hasta el final de la línea (.*
) y lo reemplazará con el patrón capturado.fuente
No estoy seguro de por qué el título de esta pregunta se ha editado " desde el archivo " a " desde una línea ", mientras que el OP no excluye la posibilidad en varias líneas, aunque el ejemplo parece ser solo una línea. Lo que sea, puede ser útil proporcionar una solución de líneas múltiples aquí.
Esto funciona para líneas cruzadas:
Ejemplos:
referencia: Expansión de parámetros de Shell
fuente