sed Fehler - nicht abgeschlossenes Ersatzmuster

7

Ich bin im Verzeichnis mit Dateien, die aus vielen Zeilen bestehen:

%Vor%

und dann eine Zeile, die endet:

%Vor%

Ich versuche, :(float) aus jeder Datei zu entfernen (aber lasse die Nummer) und entferne auch diese Bereinigung ... Zeile.

Ich kann bekommen:

%Vor%

funktioniert, aber das erzeugt Dateien, die die alten Dateien behalten. Das Entfernen des -e-Flags führt zu einem nicht abgeschlossenen Ersatzmusterfehler.

Gleiches gilt für:

%Vor%

Gedanken?

    
Mark C 16.02.2010, 04:06
quelle

6 Antworten

11
%Vor%

Auf diese Weise sagen Sie sed, dass Sie keine Kopie speichern (Erweiterung der Backup-Länge mit Null-Länge auf -i ) und die sed-Befehle separat angeben.

    
DigitalRoss 16.02.2010 04:17
quelle
3
%Vor%

entspricht:

%Vor%

und beide meinen Ausdruck auf Dateien anwenden, die Dateien überschreiben, aber die alten Dateien mit einem "e" als Backup-Suffix speichern.

Ich denke du willst:     sed -i -e Ausdruck [Dateien ...]

Wenn Sie jetzt einen Fehler bekommen, muss etwas mit Ihrem expression nicht stimmen.

    
dubiousjim 16.02.2010 04:17
quelle
3

Ihre Zahlen werden durch (float) durch das : -Zeichen getrennt. Daher können Sie awk / cut verwenden, um Ihre Zahlen zu erhalten. Es ist einfacher als eine Regex

%Vor%     
ghostdog74 16.02.2010 04:32
quelle
1
%Vor%     
Ignacio Vazquez-Abrams 16.02.2010 04:14
quelle
1

Überprüfen Sie, ob Sie irgendwelche ungeraden Dateinamen im Verzeichnis haben.

Hier ist eine Möglichkeit, Ihren Fehler zu duplizieren:

%Vor%

Eine Möglichkeit, dies zu verhindern, besteht darin, die Optionen mit einem Doppelstrich auf sed zu setzen, wenn Sie einen Platzhalter verwenden:

%Vor%

Sie können das gleiche tun, um die Datei zu entfernen:

%Vor%     
Dennis Williamson 16.02.2010 07:48
quelle
1

Lösung:

sed -i '' 's/ :(float)//g' *

sed -i '' 's/[chuck]: cleaning up...//g' *

Erläuterung:

Ich kann bekommen:

%Vor%

funktioniert, aber das erstellt Dateien, die die alten Dateien behalten.

Das liegt daran, dass sed s i flag so funktionieren soll

  

-i Erweiterung

     

Bearbeiten Sie Dateien direkt und speichern Sie Sicherungen mit der angegebenen Erweiterung . Wenn eine -Extension der Länge 0 angegeben wird, wird keine Sicherung gespeichert.

In diesem Fall wird e als Erweiterung interpretiert, mit der Sie Ihre Backups speichern möchten. Daher werden alle Ihre Originaldateien mit einem e an ihren Namen angehängt.

Um eine Erweiterung der Länge Null bereitzustellen, müssen Sie -i '' verwenden.

Hinweis : Im Gegensatz zu -i<your extension> funktioniert -i'' nicht. Sie müssen ein Leerzeichen zwischen -i und '' haben, damit es funktioniert.

Das Entfernen des -e-Flags führt zu einem nicht abgeschlossenen Ersatzmusterfehler.

Wenn Sie e unmittelbar nach -i entfernen, d. h.

sed -i 's/ :(float)//g' *

s/ :(float)//g wird nun als Erweiterung Argument für i Flag interpretiert. Und die erste Datei in der Liste der Dateien, die durch die Shell-Erweiterung von * erzeugt wurde, wird als sed function (höchstwahrscheinlich s/regular expression/replacement/flags -Funktion) interpretiert. Sie können dies überprüfen, indem Sie die Ausgabe von

überprüfen

sedfn=$(echo * | cut -d' ' -f1); [[ ${sedfn:0:1} == "s" ]]; echo $?

Wenn die Ausgabe der obigen Befehlskette 0 ist, wird unsere Annahme bestätigt.

Auch in diesem Fall, wenn der erste Dateiname irgendwie als gültige s/regular expression/replacement/flags sed-Funktion gilt, werden die anderen Dateinamen als reguläre Dateien interpretiert, damit sed arbeiten kann.

    
Bharat Khatri 26.12.2016 12:05
quelle

Tags und Links