Considerar la posibilidad de la entrada:

=sec1=
some-line
some-other-line

foo
bar=baz

=sec2=
c=baz

Si quiero proceso sólo =sec1= I puede, por ejemplo, en comentarios a la sección:

sed -e '/=sec1=/,/=[a-z]*=/s:^:#:' < input

… bueno, casi.

Esto de comentar las líneas incluyendo «=sec1=» y «=s2=» las líneas, y el resultado será algo como:

#=sec1=
#some-line
#some-other-line
#
#foo
#bar=baz
#
#=sec2=
c=baz

Mi pregunta es: ¿Cuál es la manera más fácil para excluir el inicio y el final de las líneas de un /INICIO/,/FINAL/rango en el sed?

Sé que para muchos de los casos el refinamiento de la «s:::» garras puede dar la solución en este caso específico, pero yo después de la solución genérica aquí.

En «Sed – Una Introducción y Tutorial» Bruce Barnett escribe: «yo te mostraré más adelante cómo restringir el acceso de un comando hasta, pero no incluyendo la línea que contiene el patrón especificado.», pero yo no era capaz de encontrar donde actualmente se muestran.

En el «ÚTIL DE UNA LÍNEA DE COMANDOS PARA LA SED» Compilado por Eric Pement, yo sólo he podido encontrar el inclusiva ejemplo:

# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p'             # case sensitive
InformationsquelleAutor Chen Levy | 2009-07-27

5 Comentarios

  1. 37

    Esto debe hacer el truco:

    sed -e '/=sec1=/,/=sec2=/{ /=sec1=/b; /=sec2=/b; s/^/#/}' < input
    

    Este coincidencias entre sec1 y s2, inclusive, y, a continuación, sólo se salta la primera y la última línea con el b comando. Esto deja a las líneas deseadas entre sec1 y sec2 (exclusivo), y el s comando agrega el comentario signo.

    Desafortunadamente, usted no necesita repetir el regex para que coincidan con los delimitadores. Que yo sepa no hay mejor manera de hacer esto. Al menos puede mantener el regex limpio, aunque son usados dos veces.

    Esta es una adaptación de la SED de preguntas frecuentes: ¿Cómo me dirijo a todas las líneas entre RE1 y RE2, con exclusión de las líneas de sí mismos?

    • Sí, esto es exactamente lo que yo estaba buscando. Gracias.
    • Para la gente en macOS con BSD sed que usted necesita para utilizar reales de saltos de línea en lugar de punto y coma. Para más detalles, echa un vistazo esta respuesta
    • no estoy seguro acerca de otras versiones, pero con sed de GNU, esto puede realizarse fácilmente utilizando '/=sec1=/,/=sec2=/ { //! s/^/#/ }' … de manual empty regular expression ‘//’ repeats the last regular expression match
  2. 13

    Si usted no está interesado en las líneas de fuera de la gama, sino que sólo quiere la no-inclusive variante de la Iowa/Montana ejemplo de la pregunta (que es lo que me trajo aquí), se puede escribir la «excepción de la primera y última líneas coincidentes» cláusula bastante fácilmente con un segundo sed:

    sed -n '/PATTERN1/,/PATTERN2/p' < input | sed '1d;$d'

    Personalmente, esto me parece ligeramente más claro (aunque más lento en archivos de gran tamaño) que el equivalente

    sed -n '1,/PATTERN1/d;/PATTERN2/q;p' < input

    • de niza. además, la segunda versión no volar con php, porque de ese molesto $.
    • Tengo una corazonada, no son equivalentes, en caso de haber más de uno de esos rangos, en el stream/archivo.
  3. 1

    He usado:

    sed '/begin/,/end/{/begin\|end/!p}'
    

    Esto buscará en todas las líneas entre los patrones, a continuación, imprimir todo lo que no contiene los motivos

Dejar respuesta

Please enter your comment!
Please enter your name here