Frage Entfernen Sie alles vor dem ersten Auftreten des angegebenen Wortes


Wie kann ich alles vor dem ersten Auftreten eines bestimmten Wortes mit entfernen? sed?

Was ich bisher versucht habe:

echo $(cat /etc/nginx/sites-enabled/default | sed 's/^*.server/server/') > /etc/nginx/sites-enabled/default

Ich muss den ganzen Müll aufräumen, bevor ich das erste "Server" Wort finde.

Hauptsächlich würde ich eine brauchen sed Regex ...

Ich habe eine Nginx-Standarddatei mit Proxy-Informationen, die einige führende Leerzeichen erhält, während das Skript es in einen Docker-Container kopiert und daher nicht erstellt werden kann. Ich müsste es mit einem Befehl löschen.

Datei:

       server
{
listen 80 default_server;
location / 
{
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:5000;
}
}

Ich bin mir nicht sicher, welche Art von Charakteren da sind, also möchte ich alles vor dem "Server" entfernen.


2
2018-02-18 10:29


Ursprung


Können Sie ein Beispiel dafür zeigen, was entfernt werden muss? - choroba
Bitte lesen Sie auch Hier und Hier. - kos
Ich habe die Frage mit ein paar weiteren Details bearbeitet ... - ArkadyB
Was gibt es vorher? sever? Räume, Tabellen? Wie viele? - kos
Keine Ahnung, sein Docker legt da was hin. Wenn ich es mit Nano öffne, sieht es wie Räume aus ... aber ich bin nicht sicher .. Gibt es irgendeine Weise, alles zu entfernen? - ArkadyB


Antworten:


Sie entfernen einfach jedes Leerzeichen (Tabulatoren, Leerzeichen, was auch immer) zwischen dem Zeilenanfang und dem Wort "Server" (nur wenn es sonst nur Leerzeichen gibt) mit dem folgenden einfachen Befehl:

sed -i 's/^\s*server/server/' FILENAME

Das -i Option ändert die Datei in-place, dh alle Änderungen werden sofort angewendet und gespeichert und Sie erhalten keine Ausgabe. Wenn Sie die Datei nicht neu schreiben und stattdessen die geänderte neue Version anzeigen möchten, lassen Sie die Option weg -i Option und der Befehl wird es in den STDOUT (Standard Output Stream) drucken.

Ich benutze die Regex ^\s*server um eine beliebige Anzahl von beliebigen Leerzeichen zwischen dem Zeilenanfang und dem Wort "Server" inklusive zu finden und diese Übereinstimmungen durch das Wort "Server" selbst ersetzen zu können.


2
2018-02-18 10:53





GNU sed hat eine spezielle Form der Bereichsadresse 0,/pattern/ Damit können Sie nur das erste Vorkommen von pattern in Ihrer Datei z.B.

sed '0,/server/ s/^.*server/server/' /etc/nginx/sites-enabled/default

oder (vielleicht besser, da es das Spiel auch am Anfang der Linie verankert)

sed '0,/^.*server/ s//server/' /etc/nginx/sites-enabled/default


Probieren Sie es zuerst, bevor Sie das hinzufügen -i (In-Place) -Flag und / oder verwenden Sie ein Backup -i.bak


1
2018-02-18 13:03