2016-08-09 16 views
1

Log:regex für Entfernen Sie alle Saiten beginnt mit Lauf und endet mit:

runHalfMarathon ==>> 44 :: runFullMarathon ==>> 21 :: Name ==>> Suresh :: Age ==>> 21 :: 

Regex:

sed 's/run* ==>> [0-9]* //g' -i sample.log 

seine nicht funktioniert. Ich möchte alle Strings entfernen beginnt mit Lauf

Erwartete Ausgabe:

Name ==>> Suresh :: Age ==>> 21 :: 

Bitte helfen.

+1

Es wird nicht funktionieren, weil 'n *' entspricht 0 oder mehr 'n' Symbole. Du musst mit '[^ =] *' gemeint sein. –

Antwort

1

Es wird nicht funktionieren, weil n* 0 oder mehr n Symbole entspricht. Wenn Sie .* verwenden, können Sie zu viel von der Zeichenfolge entfernen.

Ich schlage vor, zu ersetzen * mit [^=]* mit (das wird passen null oder mehr Zeichen andere als ein =) und fügen Sie *:: * am Ende auch :: um mit Leerzeichen zu entfernen:

sed 's/run[^=]* ==>> [0-9]* *:: *//g' 

this demo See.

0

können Sie Folgendes verwenden:

sed -r 's/.+?Name/Name/g' 

Die .+?Name für alles Namen bis einschließlich aussieht. Wir ersetzen dann alles, was wir gefunden haben, mit nur Name, was bedeutet, dass wir die vorherigen Teile effektiv loswerden.

Beachten Sie die Optionen sed geben:

-r use extended regular expressions in the script 

Beispieldaten:

$ cat m 
runHalfMarathon ==>> 44 :: runFullMarathon ==>> 21 :: Name ==>> Suresh :: Age ==>> 21 :: 
runHalfMarathon ==>> 44 :: runFullMarathon ==>> 21 :: Name ==>> foo :: Age ==>> 20 :: 
runHalfMarathon ==>> 44 :: runFullMarathon ==>> 21 :: Name ==>> bar :: Age ==>> 1 :: 
runHalfMarathon ==>> 44 :: runFullMarathon ==>> 21 :: Name ==>> baz :: Age ==>> 0 :: 

Beispiel Ausgabe:

$ cat m | sed -r 's/.+?Name/Name/g' 
Name ==>> Suresh :: Age ==>> 21 :: 
Name ==>> foo :: Age ==>> 20 :: 
Name ==>> bar :: Age ==>> 1 :: 
Name ==>> baz :: Age ==>> 0 :: 
Verwandte Themen