Wie lösche ich in einer Textdatei alles (in jeder Zeile) nach einem Zeichenmuster (einschließlich des Musters)?

Wie lösche ich in einer Textdatei alles (in jeder Zeile) nach einem Zeichenmuster (einschließlich des Musters)?

Im Grunde brauche ich das, was der OP dieser Frage bekommen hat, aber nicht wollte. Wie lösche ich alles nach einem bestimmten Muster oder einer Zeichenfolge in einer Datei?

Ich habe also folgende Daten erhalten:

Something and something ........................... 23
Another one .......................................123
Somethingelse Inc. .................................243

Ich möchte also alle Punkte (und Zahlen) nach dem Leerzeichen löschen.

Bisher habe ich versucht, den Befehl des OP dort zu verwenden, aber er hat nicht ganz so funktioniert wie erwartet, da er alles nach dem ersten Punkt löscht, auf den er stößt. Das bedeutet, dass auch der Punkt in den Daten der Sorte Somethinelse Inc. gelöscht wird.

Ich habe versucht, die erste (sed) Antwort auf diese Frage zum Laufen zu bringen, indem ich das erste .com durch drei Punkte und das zweite durch ein Leerzeichen ersetzt habe, aber das ist mir nicht gelungen. Dieses Mal wird alles nach dem ersten Leerzeichen gelöscht oder es bleiben drei Punkte übrig.

Die zweite Antwort (z. B. -sc ...) funktionierte wie vom OP gewünscht, ließ bei mir aber ein paar Punkte zurück, sodass ich auch damit kein Glück hatte.

Ich habe auch versucht, den Befehl aus dieser Antwort zu optimieren, aber auch das ist fehlgeschlagen.Wie kann ich aus einer Zeile alles bis zu einem Muster und alles nach einem anderen Muster löschen?

Antwort1

sed 's/ \.\..*$//' /path/to/filesollte arbeiten:

 \.\. - A space followed by two literal periods
.*    - One or characters of any type
$     - End of line 

Antwort2

Eine andere, aber nicht elegante Lösung könnte sein:

cat path/to/yourfile | sed -E "s/[\.]{2,}//g" | sed "s/[0-9]//g" > path/to/new_file

Wo:

  • -EInterpretieren Sie reguläre Ausdrücke als erweiterte (moderne) reguläre Ausdrücke
  • [\.]{2,}Übereinstimmung mit einem Punkt pro zwei oder mehr Vorkommen
  • [0-9]alle Ziffern abgleichen

  • s/expr//gexprbedeutet , so viel wie möglich durch nichts zu ersetzen (g)

Antwort3

Wie wäre es damit:

sed 's/\.\+ *[[:digit:]]\+[[:space:]]*$//g'

was bedeutet:

eins+zu+viele(\+)Punkte(\.)UND Null-zu-viele(*)Räume( )UND eins+zu+viele(\+) Ziffern([[:Ziffer:]])UND für den Fall, dass(*) Leerzeichen ([[:Raum:]])UND Ende dieser Zeile ($)

Getestet mit (Beachten Sie, dass ich in der 2. Zeile „…234“ und am Ende Tabulatoren/Leerzeichen eingefügt habe):

Something and something ........................... 23<Tab>
An ...234 other one .......................................123<space>
Somethingelse Inc. .................................243<some spaces>

Und das Ergebnis:

xb@dnxb:/tmp$ sed 's/\.\+ *[[:digit:]]\+[[:space:]]*$//g' sample.txt
Something and something 
An ...234 other one 
Somethingelse Inc. 
xb@dnxb:/tmp$ 

verwandte Informationen