Ich habe eine CSV-Datei mit 7 Spalten und ich bin nur an der Änderung der ersten Spalte interessiert. Tatsächlich erscheint in einigen Zeilen ein Zeilenname n mal in verketteter Weise ohne Leerzeichen. Ich brauche ein Skript, das den Beginn der Duplizierung erkennt und alle Duplikate entfernt.BASH: Split-Strings ohne Trennzeichen und behalten nur erste Teilzeichenfolge
Beispiel eines Zeilennamen unter anderem:
Row name = EXAMPLE1.ABC_DEF.panel4EXAMPLE1.ABC_DEF.panel4EXAMPLE1.ABC_DEF.panel4
ersetzen durch: EXAMPLE1.ABC_DEF.panel4
In den verschiedenen Reihen:
n kann variieren
Die Länge des Zeilennamen
Die Struktur des Zeilennamen kann variieren (zB kann variieren. Menge an
_
und.
), aber es ist immer ohne Raum
zusammengestellt Was ich versucht habe:
:%s/(.+)\1+/\1/
Schritt-für-Schritt:
%s
: ersetzen Sie in der ganzen Datei(.+)\1+
: Erste Erfassungsgruppe..+
entspricht einem beliebigen Zeichen (mit Ausnahme von Leitungsabschlüssen),+
ist der Quantifizierer - Übereinstimmungen zwischen einem und unbegrenzten Zeiten, so oft wie möglich, nach Bedarf zurückgeben.\1+
: stimmt mit dem gleichen Text wie zuletzt durch die erste abgestimmte GruppeErsatz von
\1
Erfassung erhalte ich die folgenden Fehler jedoch:
E65: Unzulässige Rückreferenz
E476 0
: ungültiger Befehl
Was das Werkzeug, das diese gibt, ist Fehler? Der Befehl, den Sie gepostet haben, entspricht dem, was Sie erwarten, wenn Sie mit sed arbeiten: 'sed -E/(. +) \ 1 +/\ 1/'file' – oliv
@oliv Sieht aus wie vi/Vim? –
Sie müssen entkommen: ':% s/\ (. \ + \) \ 1 \ +/\ 1 /' –