2010-02-16 4 views
7

Ich bin im Verzeichnis mit Dateien von vielen Linien von Zeilen wie diese aus:sed Fehler - ungekündigten Ersatzmuster

98.684807 :(float) 
52.244898 :(float) 
46.439909 :(float) 

und dann einer Linie, die endet:

[chuck]: cleaning up... 

ich versuche zu beseitigen :(float) von jeder Datei (aber lassen Sie die Nummer) und entfernen Sie auch diese Bereinigung ... Zeile.

kann ich:

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

zu arbeiten, aber das erstellten Datei, die die alten Dateien halten. Das Entfernen des -e-Flags führt zu einem nicht abgeschlossenen Ersatzmusterfehler.

Same Deal mit:

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

Gedanken?

+0

Was bedeutet "erstellt Dateien, die die alten Dateien enthält"? –

+0

Wenn ich eine Datei namens abc habe. Es entfernt die Zeilen aus der Datei abc, erstellt aber eine Datei namens abce. –

+2

Das 'g' ist nicht notwendig, wenn das Muster nur einmal pro Zeile erscheint. –

Antwort

1
sed -i -e 's/ :(float)//g' * 
11
sed -i '' -e 's/:(float)//' -e '/^.chuck/d' * 

Auf diese Weise kann sed erzählt keine Kopie (null Länge Backup-Erweiterung zu -i) und separat unter Angabe der sed-Befehle zu speichern.

3
sed -ie expression [files...] 

entspricht:

sed -ie -e expression [files...] 

und beide bedeuten Ausdruck auf Dateien anwenden, überschreibt die Dateien, aber die alten Dateien mit einem „e“ als Backup-Suffix zu speichern.

Ich glaube, Sie wollen: sed -i -e expression [Dateien ...]

Nun, wenn Sie einen Fehler, wenn es darum aus, dass es etwas falsch mit Ihrem expression sein muss.

3

Ihre Nummern sind mit (float) durch die : Zeichen getrennt. Daher können Sie awk/cut verwenden, um Ihre Zahlen zu erhalten. Es ist einfacher als ein Regex

$ head -n -1 file | awk -F":" '{print $1}' 
98.684807 
52.244898 
46.439909 

$ head -n -1 file | cut -d":" -f1 
98.684807 
52.244898 
46.439909 
1

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

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

$ touch -- "-e s:x:" 
$ ls 
-e s:x: 
$ sed -i "s/ :(float)//g' * 
sed: -e expression #1, char 5: unterminated `s' command 

Eine Möglichkeit, gegen diese zu schützen, ist ein Doppelstrich verwenden, um die Optionen zu sed zu beenden, wenn Sie eine Wild Card verwenden:

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

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

$ rm "-e s:x:" 
rm: invalid option -- 'e' 
$ rm -- "-e s:x:" 
1

Lösung:

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

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

Erläuterung:

kann ich:

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

zu arbeiten, aber das erstellt Dateien, die die alten Dateien behalten.

Das ist, weil sed ‚s i Flagge soll auf diese Weise e

-i extension

Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved.

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

Um eine Verlängerung der Länge Null zu erhalten, 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.


Entfernen der -en Ergebnisse in ein nicht abgeschlossenen Ersatzmusterfehlern.

Wenn Sie die e unmittelbar nach -i entfernen, das heißt

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

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

Prüfung

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

Wenn der Ausgang der über Befehlskette ist 0, unsere Annahme wird bestätigt.

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

Verwandte Themen