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 @TEST
y 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