2017-06-29 2 views
1

Ich werde verrückt versuchen, die sed BRE (Basic Regular Expression) Regeln zu folgen, um eine ziemlich einfache Vorkommen in einer HTML-Datei zu ersetzen.Verwenden von SED, um variablen Text in HTML-Datei zu ersetzen

Ich denke, ich folge the spec korrekt, aber keiner meiner Versuche funktionieren.

Was ich tun möchte ist, den Inhalt eines Meta-Tags durch etwas Neues zu ersetzen (was ich als Teil des Skripts, das ich schreibe, berechne). Grundsätzlich sieht das Meta-Tag wie folgt aus:

<meta version="v0.103.2" />

Es ist immer ein Attribut enthält, die die Syntax folgt, die in einem JS regulären Ausdruck könnte so charakterisiert werden:

/version=\"v[0-9]+\.[0-9]+\.[0-9]+\"/g

Also ich Ich habe eine ganze Reihe von sed-Befehlen ausprobiert, um das funktionieren zu lassen, und es scheint einfach nicht so zu funktionieren, wie es dokumentiert ist, es sei denn, ich missverstehe die Dinge. Einige der Befehle, die ich versucht habe:

Ich bin auf einem Mac (die wegen sed syntax changes between Unix/Linux Angelegenheiten), und dies erklärt die '' in folgenden Befehle.

 
✗ sed -i -E '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i -E '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g './src/index.html' 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\whatever/g ./src/index.html 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[:digit:]+\.[:digit:]+\.[:digit:]+/version=\whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:]+\.[:digit:]+\.[:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:][:punct:][:digit:][:digit:][:digit:][:punct:][:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:][:punct:][:digit:][:digit:][:digit:][:punct:][:digit:]/whatever/g ./src/index.html 
✗ sed -i '' s/v[0-9]+\.[0-9]+.[0-9]+/whatever/g ./src/index.html 
✗ sed -i '' s/version=\"[^ \"]+\"/whatever/g ./src/index.html 
✗ sed -i '' s/version="[^ "]+"/whatever/g ./src/index.html 
✗ sed -i '' s/version=\"[^\"]+\"/whatever/g ./src/index.html 
✗ sed -i '' s/version=/whatever=/g ./src/index.html 
✗ sed -i '' s/version=\"/whatever=\'/g ./src/index.html 
✗ sed -i '' s/version=\"[^\"]/whatever=\"/g ./src/index.html 

Hilfe? Es ist die Datei richtig finden. Wenn ich Versionen davon tue, die keine Regex enthalten (siehe dritte von unten), wird sie korrekt ersetzt, aber irgendwie scheint meine Regex-Syntax hier nicht zu funktionieren.

Oder kann jemand an eine einfachere/zuverlässigere Möglichkeit denken, dies zu tun?

+1

Try 'sed -i '' "s/version = \" v [0-9] * \ [. 0-9] * \. [0-9] * \ "/ was auch immer =/g"./Src/index.html " –

+0

@ WiktorStribiżew - Das hat funktioniert! Willst du es eine Antwort machen, damit ich es auswählen kann? – Sasha

Antwort

2

Sie müssen die Regex zitieren und statt + (das als wörtliche + von der BRE POSIX behandelt wird) verwenden entweder * (das entspricht oder mehrere Vorkommen) oder \{1,\} Bereich quantifier (in BRE POSIX, die {n,m} muss als \{m,n\} geschrieben werden), die 1 oder mehr Vorkommen entspricht.

So können Sie

sed -i '' "s/version=\"v[0-9]*\.[0-9]*\.[0-9]*\"/whatever=/g" ./src/index.html 

Mit einfachen Anführungszeichen verwenden:

sed -i '' 's/version="v[0-9]*\.[0-9]*\.[0-9]*"/whatever=/g' ./src/index.html 
+2

Warum mit doppelten Anführungszeichen und Escape-Anführungszeichen zitieren? Kann nur einfache Anführungszeichen verwenden, müssen doppelte Anführungszeichen nicht umgehen? –

+0

@BenjaminW .: Ja, wir können, du bist nicht der erste, der mir das sagt, und nicht das erste oder auch das zweite Mal. Ich programmiere hauptsächlich in C# und bin sehr an C# String-Literale gewöhnt, die nicht mit einfachen Anführungszeichen definiert werden können. Ich habe vor kurzem mit Linux, 'grep',' sed', etc. angefangen. –

Verwandte Themen