Wie kürzt man die Zeilen in einer Datei, die zwischen bestimmten Mustern vorkommen, auf eine bestimmte Länge?

Wie kürzt man die Zeilen in einer Datei, die zwischen bestimmten Mustern vorkommen, auf eine bestimmte Länge?

Ich habe mehrere Dateien, in denen ich nur die Zeilen abschneiden muss, die zwischen dem Muster @TEST und enabled="true"> stehen. Wenn eine Übereinstimmung vorliegt, sollte die Zeichenfolge zwischen @TESTund enabled="true">nur 50 Zeichen lang sein. Alle anderen Zeilen sollten unverändert bleiben.

Beispiel:

@TEST-TC_0010 @TEST Überprüfen Sie, dass der RADIUS-Accounting-Server beim Empfang des Accounting-Request-Pakets vom RADIUS-Client keine Accounting-Response-Nachricht senden soll" enabled="true">

Ich muss die obige Zeile wie unten gezeigt ändern.

@TEST-TC_0010@PRÜFENStellen Sie sicher, dass der RADIUS-Accounting-Server nichtaktiviert="true">

Antwort1

In diesem Fall können Sie grep mit Perl-Lookarounds verwenden.

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

Der Ausdruck „(?<=)“ markiert den Punkt, an dem eine Übereinstimmung beginnt, und der Ausdruck „(?=)“ ist der Punkt, an dem die Übereinstimmung endet.

Das ".*" weist grep an, alles zwischen den Anfangs- und Endpunkten zurückzugeben.

Mit Ihrer Testeingabe gibt die obige Zeile 157 Zeichen zurück.

$ 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

Wenn Sie dies weiter auf nur die ersten 50 Zeichen kürzen möchten, können Sie cut verwenden.

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

Wenn Sie die Ergebnisse in einer Datei speichern möchten, müssen Sie die Ausgabe in eine andere Datei umleiten. Sie können etwas wie das Folgende verwenden ...

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

Das Überschreiben der Eingabedatei würde ich persönlich nicht empfehlen, da Sie die Originaldaten möglicherweise irgendwann benötigen.

Wenn Sie also alle anderen Einträge in der Datei behalten und nur die Zeilen abschneiden möchten, in denen „enabled=‚true‘“ steht, müssen wir die Tools auf awk ändern.

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

Dieser Oneliner gibt jede Zeile, die nicht mit „true“ übereinstimmt, unverändert aus. Wenn „true“ übereinstimmt, wird die Zeile auf 50 Zeichen gekürzt. Auch hier empfehle ich nicht, die Originaldaten zu überschreiben, daher werden die Ergebnisse in eine Ausgabedatei weitergeleitet.

Basierend auf den letzten Änderungen, die der OP an der Frage vorgenommen hat, habe ich den awk-Einzeiler geändert, um die Ausgabe von Beginner zu reproduzieren. Er hat in seinem Kommentar erwähnt, dass awk nicht funktioniert. Bis der OP weitere Einzelheiten dazu liefert, warum awk nicht funktioniert, wird die folgende Zeile bei Verwendung von awk 4.1.3 unter Ubuntu 16.04 die Ergebnisse zurückgeben, die er bisher detailliert beschrieben hat.

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

verwandte Informationen