2011-08-25 15 views
6

Próbuję zastąpić zawartość niektórych znaczników HTML na stronie HTML za pomocą sed w skrypcie bash. Z jakiegoś powodu nie otrzymuję prawidłowego wyniku, ponieważ nic nie zastępuje. Musi to być coś bardzo prostego/głupiego, z którego nie mogę wyjść, czy ktoś chce mi pomóc?Zastępowanie zawartości znacznika HTML za pomocą sed

HTML do wyszukiwania/zastąpić w:

Unlocked <span id="unlockedCount"></span>/<span id="totalCount"></span> achievements for <span id="totalPoints"></span> points. 

sed polecenia używany:

cat index.html | sed -i -e "s/\<span id\=\"unlockedCount\"\>([0-9]\{0,\})\<\/span\>/${unlockedCount}/g" index.html 

Punkt ten jest do analizowania stronę HTML i aktualizować dane według niektórych danych zewnętrznych. Dla pierwszego uruchomienia zawartość tagów będzie pusta, po czym zostaną wypełnione.


EDIT:

skończyło się stosując kombinację odpowiedzi, które doprowadziły do ​​następującego kodu:

sed -i -e 's|<span id="unlockedCount">\([0-9]\{0,\}\)</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html 

Wiele dzięki @Sorpigal, @tripleee, @classic dla pomoc!

+0

To bezużyteczne użycie kota – Sorpigal

+0

, ale zmiana "kota" na f.e. "mniej" tak naprawdę nie rozwiąże mojego problemu, prawda? – Revell

+1

Nie, ale "sed" ... "plik_wejściowy" będzie i jest jedynym właściwym sposobem, aby to zrobić, jeśli chcesz użyć 'sed -i'. – tripleee

Odpowiedz

5

Spróbuj tego:

sed -i -e "s/\(<span id=\"unlockedCount\">\)\(<\/span>\)/\1${unlockedCount}\2/g" index.html 
+1

To się nie powiedzie po raz pierwszy. Musisz dopasować '[0-9] \ {0, \}' pomiędzy znacznikami span. – Sorpigal

+0

Tak, jeśli ma zastąpić wartość w zakresie, to należy poprawić – classic

1
sed -i -e 's%<span id="unlockedCount">([0-9]*)</span\>/'"${unlockedCount}/g" index.html 

I usunięte bezużyteczny Zastosowanie kot, wyjął kilka niepotrzebnych ukośników, dodaje apostrofy regex ochrony przed ekspansją powłoki i utrwalono operatora powtórzeń. Wciąż może być konieczne ukośnik odwrotny do nawiasów grupowania; mój sed, przynajmniej, chce \ (... \).

Uwaga na użycie cudzysłowów pojedynczych i podwójnych obok siebie. Pojedyncze cudzysłowy chronią przed ekspansją powłoki, więc nie możesz ich używać w "$ {unlockedCount}", gdzie chcesz, aby interpolacja zmiennej była interpolowana.

1

Co mówisz, że chcesz zrobić, to nie to, co mówisz sed zrobić.

Chcesz wstawić numer do tagu lub zastąpić go, jeśli jest obecny. To, co próbujesz powiedzieć, aby sed zrobić, to zastąpić tag span i jego zawartość, jeśli istnieje lub liczba, wartością zmiennej powłoki.

Używasz również wielu skomplikowanych, denerwujących i podatnych na erorię sekwencji ucieczki, które nie są potrzebne.

Oto co chcesz:

sed -r -i -e 's|<span id="unlockedCount">([0-9]{0,})</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html 

Note różnice:

  • Dodany -r włączyć rozszerzonych wyrażeń bez którego Twój wzór przechwytywania nie będzie działać.
  • Użyto | zamiast / jako ogranicznika dla podstawienia, aby uniknięcie / nie było konieczne.
  • Wyrażenie jednoosobowe o wyrażeniu sed, dzięki czemu unikanie obiektów znajdujących się wewnątrz powłoki nie będzie konieczne.
  • Zawarto dopasowany znacznik zakresu w sekcji zamiennej, aby nie został usunięty.
  • Aby rozwinąć zmienną unlockedCount, należy zamknąć wyrażenie z pojedynczym cytowaniem, a następnie ponownie je otworzyć.
  • Pominięty cat |, który tutaj był bezużyteczny.

Użyłem również podwójnego cudzysłowu wokół zmiennej zmienności powłoki, ponieważ jest to dobra praktyka, ale jeśli nie zawiera spacji, nie jest to konieczne.

Nie było, ściśle mówiąc, konieczne, aby dodać -r. Zwykły stary sed zadziała, jeśli powiesz \([0-9]\{0,\}\), ale pomysłem było uproszczenie.

+0

-r nie wydaje się być prawidłowym poleceniem sed? W systemie Mac OS przynajmniej. – Revell

+1

W systemie MacOS X przełącznik do włączania wyrażeń rozszerzonych będzie inny (prawdopodobnie "-E", styl BSD). '-r' jest przełącznikiem GNU sed. – Sorpigal

Powiązane problemy