2017-01-31 3 views
0

Beispiel: Ich möchte die folgenden zwei Zeilen löschen, wenn die * nach dem zweiten Auftreten von : erscheint.Ich möchte die gesamte Zeile löschen, wenn auf das zweite Auftreten eines Sonderzeichens ein bestimmtes Zeichen folgt

/path/:456: * This entire line needs to be deleted 

/auto/myfolder/:999 :    * This entire line should get deleted 

Hinweis: * sollte das erste Zeichen nach dem zweiten :, werden Leerzeichen ignorieren.

kann mir jemand helfen, es in einem Shell-Skript mit sed oder Grep arbeiten zu lassen?

Vielen Dank.

+0

Kann es noch mehr sein ':'? Also, kann es eine Zeile wie '/ path /: 789 geben: einige Daten: * Diese ganze Zeile muss gelöscht werden. Ansonsten würde das auch funktionieren:' awk -F: '! ($ 3 ~/\ * /)' Dateiname ' – anishsane

Antwort

1

Mit sed:

sed '/^[^:]*:[^:]*:[ \t]*\*/d' file 

Erläuterung:

  • ^: am Anfang der Zeile beginnt
  • [^:]*:: Suche nach null oder mehr (*) nicht : Zeichen folgen von :
  • [^:]*:: eine beliebige Anzahl von Räumen tabs
  • \*:: wie oben gleiche Muster für die zweite :
  • [ \t]* suchen * entkommen
  • wenn Muster gefunden wird, gelten die d (Löschen) Befehl an die Leitung

Wie [^:]*: wiederholt wird, können Sie \{2\} quantifier verwenden stattdessen:

sed '/^\([^:]*:\)\{2\}[ \t]*\*/d' file 

Fügen Sie die -i Fahne, um die Datei an seinem Platz zu bearbeiten:

sed -i '/^[^:]*:[^:]*:[ \t]*\*/d' file 
+0

Thnks Le, kannst du bitte den Regex erklären? –

+0

Fertig. Sag mir, ob es klar genug ist. – SLePort

+0

Ja, es funktioniert perfekt. –

Verwandte Themen