unix sed – sed/awk reemplaza un patrón específico bajo otro patrón

Pregunta:

Así que tengo un archivo así

[ABC]
value1=bla
value2=bla
value3=bla
[XYZ]
value1=bla
value2=bla
value3=bla

Y me gustaría reemplazar value1 debajo del bloque [ABC] con "value1=notbla" y no debajo del bloque [XYZ]. ya he probado

sed '/ABC/{n;s/.*/change/}'  file

Pero eso solo funcionaría cuando intentara ir a la siguiente línea y no cambiaría el patrón específico (es decir, si el valor 1 estaba por debajo del valor 2) ¿Qué comando sed o awk podría usar si no supiera los números de línea específicos? ¿Y puede etiquetar la función de cada etiqueta sed o awk utilizada? Yo realmente lo apreciaría.

Respuesta:

Sed puede manejar esto con bastante facilidad. Es un solo comando "sustituto", precedido por un rango de direcciones. He agregado espacio adicional para una mejor legibilidad:

sed -e '/^\[ABC\]$/ , /^\[.*\]$/     s/^\(value1=\).*$/\1notbla/'

Sin el espacio adicional, es:

sed -e '/^\[ABC\]$/,/^\[.*\]$/s/^\(value1=\).*$/\1notbla/'

Realmente no necesita expresiones regulares ancladas, pero pueden ser más seguras en algunos casos de entradas inusuales. Una versión un poco más corta con expresiones regulares no ancladas es:

sed -e '/\[ABC\]/,/^\[/s/^\(value1=\).*$/\1notbla/'

Explicación:

Usted pidió que se explicara cada bandera u opción, y tengo tiempo, así que aquí tiene. Estoy explicando la versión final (más corta) de los tres comandos Sed enumerados anteriormente.

La primera parte de la línea es un intervalo de direcciones: /startregex/,/stopregex/ El s comando ubstitute que sigue el rango de direcciones se aplica solamente a las líneas de startregex a stopregex (inclusive).

En este caso, la expresión regular de inicio es /\[ABC\]/ . Los corchetes suelen ser caracteres especiales dentro de una expresión regular, por lo que colocamos una barra invertida antes de cada uno para indicar caracteres de corchetes literales.

La expresión regular de parada es /^\[/ , que usa el carácter especial de expresión regular ^ para indicar el comienzo de una línea. Este patrón coincidirá con cualquier línea que comience con un corchete izquierdo literal ( [ ).

El s comando ubstitute es básicamente muy simple; el formato general es s/findregex/replacetext/ . También puede tener banderas especiales colocadas después del / final para modificar su comportamiento, pero no estoy usando ninguna de esas banderas aquí.

El "buscar expresión regular" es ^\(value1=\).*$ .

El signo de intercalación ( ^ ) coincide con el inicio de la línea, como se mencionó anteriormente, y el signo de dólar ( $ ) coincide con el final de la línea. Entonces, todo este patrón debe coincidir con una línea completa, no solo con parte de una.

Los paréntesis ( () ), a diferencia de los corchetes, no son especiales de forma predeterminada en las expresiones regulares, por lo que colocamos las barras invertidas antes de ellos para darles su significado especial. Permiten que partes del texto coincidente (el texto coincidente con "buscar expresión regular") se utilicen en el texto de reemplazo. Específicamente, el \1 en el texto de reemplazo significa "El texto coincidió dentro del primer paréntesis en la expresión regular". En este caso, eso siempre es solo "value1=".

El elemento final en "buscar expresión regular" es .* . El punto ( . ) significa "cualquier carácter único" y el asterisco ( * ) significa "cualquier número de veces (cero o más)". Entonces, el punto estrella ( .* ) coincide con todo el resto de la línea, después del signo igual.

"notbla" en el texto de reemplazo es solo texto estático, no tiene nada de especial.


Para aprender realmente Sed correctamente, recomiendo encarecidamente el tutorial Grymoire Sed , que es gratuito en línea.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım