substitute examples unix scripting sed text-manipulation

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