was macht der Befehl sed -e 's/\(~\).*\(~\)//
mit einer Textdatei? Ich verstehe es nicht. Ich bin bei meiner Arbeit darauf gestoßen.
Antwort1
Der Befehl (wenn Sie am Ende ein fehlendes einfaches Anführungszeichen hinzufügen) druckt alle Zeilen der Datei auf dem Terminal aus, aber wenn ~
in einer Zeile mindestens zwei (Tilde-)Zeichen stehen, ~
wird das Bit zwischen dem ersten und dem letzten mithilfe eines Ersetzungsbefehls ( s
) in entfernt sed
.
Beispiel:
$ cat file
1 2 3 ~ 4
1~2~3
Here is ~ the last ~ line ~ THE END
$ sed -e 's/\(~\).*\(~\)//' file
1 2 3 ~ 4
13
Here is THE END
Die \(
und \)
sind jedoch nicht erforderlich (da im Ausdruck keine Rückverweise verwendet werden) und das -e
kann auch weggelassen werden (da es nur einen Ausdruck gibt), sodass der Befehl äquivalent zu
sed 's/~.*~//' file
Es ist also nichtTunnichts an der Datei selbst, aber es liest und ändert den Inhalt der Datei und erzeugt einen verarbeiteten Text, den Sie dann mit einer Umleitung ( sed ... >newfile
) in einer neuen Datei speichern können.
Ein Rückverweiskönntekann in diesem Befehl wie folgt verwendet werden:
sed 's/\(~\).*\1//' file
D. h., suchen Sie nach einem ~
, dann nach einem anderen Text und dann nach dem gleichen Text, den wir in der ersten \(...\)
Gruppe gefunden haben (eine Tilde). Dies spart jedoch weder Tipparbeit noch macht es den Befehl einfacher zu verwalten oder zu verstehen, es wäre also keine Verbesserung gegenüber sed 's/~.*~//' file
.