¿Cómo truncar las líneas a una longitud específica en un archivo que ocurre entre patrones específicos?

¿Cómo truncar las líneas a una longitud específica en un archivo que ocurre entre patrones específicos?

Tengo varios archivos en los que tengo que truncar solo las líneas que se encuentran entre el patrón @TEST y enable="true">. Cuando hay una coincidencia, la cadena entre @TESTy enabled="true">debe tener solo 50 caracteres. Todas las demás líneas deben dejarse intactas.

Ejemplo:

@TEST-TC_0010 @TEST Verifique que el servidor de contabilidad RADIUS no debe enviar el mensaje de respuesta de contabilidad al recibir el paquete de solicitud de contabilidad del cliente RADIUS" enable="true">

Tengo que cambiar la línea anterior como se muestra a continuación.

@PRUEBA-TC_0010@PRUEBAVerifique que el servidor de contabilidad RADIUS nohabilitado="verdadero">

Respuesta1

En este caso, puede utilizar grep con opciones de Perl.

grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile

La expresión "(?<=)" marca el punto en el que comenzará una coincidencia y la expresión "(?=)" es el punto en el que termina la coincidencia.

El ".*" le dice a grep que devuelva todo lo que se encuentre entre los puntos inicial y final.

Usando su entrada de prueba, la línea anterior devuelve 157 caracteres.

$ echo "Verify that the RADIUS accounting server should not send the Accounting-Response Message on Receiving the Accounting-Request Packet from the RADIUS Client" | wc -m
157

Si desea truncar esto aún más a solo los primeros 50 caracteres, puede usar cortar

$ grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile | cut -c1-50
Verify that the RADIUS accounting server should no

Si desea guardar los resultados en un archivo, deberá canalizar la salida a otro archivo. Puedes usar algo como lo siguiente...

$ grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile | cut -c1-50 >> outputfile

Sobrescribir el archivo de entrada no es algo que recomendaría personalmente, ya que es posible que necesites utilizar los datos originales en algún momento.

Entonces, si necesita conservar todas las demás entradas del archivo y truncar solo aquellas líneas en las que enable="true", debemos cambiar las herramientas a awk.

$ awk  -F'@TEST' '{if (/true/) print substr($3,2,50); else print $0}' inputfile >> outputfile

Este oneliner generará, sin cambios, cada línea que no coincida con la verdadera. Cuando coincide con verdadero, la línea se truncará a 50 caracteres. Nuevamente, no recomiendo sobrescribir los datos originales para que los resultados se canalicen a un archivo de salida.

Según las ediciones más recientes realizadas a la pregunta por el OP, modifiqué la frase de awk para replicar el resultado proporcionado por Principiante. Mencionó en su comentario que awk no funciona. Hasta que el OP proporcione más detalles sobre por qué awk no funciona, cuando use awk 4.1.3 en Ubuntu 16.04, la siguiente línea devolverá los resultados que ha detallado hasta ahora.

awk  -F'@TEST' '{if (/true/) print "@TEST"$2,"@TEST",substr($3,2,50),"enabled=\"true\">"; else print $0}' inputfile >> outputfile

información relacionada