unix - examples - sed substitute
excluyendo las lĂneas primera y Ășltima de sed/START/,/END/ (5)
Esto debería funcionar:
sed -e ''/=sec1=/,/=sec2=/ { /=sec1=/b; /=sec2=/b; s/^/#/ }'' < input
Esto coincide entre sec1 y sec2 inclusivamente y luego se salta la primera y la última línea con el comando b
. Esto deja las líneas deseadas entre sec1 y sec2 (exclusivo), y el comando s
agrega el signo de comentario.
Desafortunadamente, necesitas repetir las expresiones regulares para hacer coincidir los delimitadores. Por lo que sé, no hay mejor manera de hacer esto. Al menos puedes mantener las expresiones regulares limpias, aunque se utilicen dos veces.
Esto está adaptado de las preguntas más frecuentes de SED: ¿Cómo trato todas las líneas entre RE1 y RE2, excluyendo las líneas?
Considere la entrada:
=sec1=
some-line
some-other-line
foo
bar=baz
=sec2=
c=baz
Si deseo procesar solo = sec1 = puedo, por ejemplo, comentar la sección por:
sed -e ''/=sec1=/,/=[a-z]*=/s:^:#:'' < input
... bueno, casi.
Esto comentará las líneas, incluidas las líneas "= sec1 =" y "= sec2 =", y el resultado será algo así como:
#=sec1=
#some-line
#some-other-line
#
#foo
#bar=baz
#
#=sec2=
c=baz
Mi pregunta es: ¿Cuál es la forma más fácil de excluir las líneas de inicio y final de un / START /, / END / rango en sed ?
Sé que en muchos casos el refinamiento de las garras "s :::" puede dar solución en este caso específico, pero estoy buscando la solución genérica aquí.
En " Sed: una introducción y tutorial " Bruce Barnett escribe: "Te mostraré más adelante cómo restringir un comando hasta, pero sin incluir la línea que contiene el patrón especificado", pero no pude encontrar dónde se muestra realmente esta.
En " ÚLTIMOS GUÍAS ÚTILES PARA SED " Compilado por Eric Pement, pude encontrar solo el ejemplo inclusivo:
# print section of file between two regular expressions (inclusive)
sed -n ''/Iowa/,/Montana/p'' # case sensitive
He usado:
sed ''/begin/,/end/{/begin/|end/!p}''
Esto buscará todas las líneas entre los patrones, luego imprimirá todo lo que no contenga los patrones
Otra forma sería
sed ''/begin/,/end/ {
/begin/n
/end/ !p
}''
/begin/n
-> omita la línea que tiene el patrón "comenzar"
/end/ !p
-> imprime todas las líneas que no tienen el patrón "final"
Tomado del tutorial sed de Bruce Barnett http://www.grymoire.com/Unix/Sed.html#toc-uh-35a
Si no está interesado en líneas fuera del rango, pero solo desea la variante no inclusiva del ejemplo de Iowa / Montana de la pregunta (que es lo que me trajo aquí), puede escribir "excepto para el primero y el último". haciendo coincidir la cláusula "lines" con suficiente facilidad con un segundo sed:
sed -n ''/PATTERN1/,/PATTERN2/p'' < input | sed ''1d;$d''
Personalmente, esto me parece un poco más claro (aunque más lento en los archivos de gran tamaño) que el equivalente
sed -n ''1,/PATTERN1/d;/PATTERN2/q;p'' < input
también podrías usar awk
awk ''/sec1/{f=1;print;next}f && !/sec2/{ $0="#"$0}/sec2/{f=0}1'' file