2011-08-25 37 views
6

Tôi đang cố gắng thay thế nội dung của một số thẻ HTML trong trang HTML bằng cách sử dụng sed trong tập lệnh bash. Vì một số lý do tôi không nhận được kết quả phù hợp vì nó không thay thế bất cứ điều gì. Nó phải là một cái gì đó rất đơn giản/ngu ngốc im nhìn, bất cứ ai chăm sóc để giúp tôi ra?Thay thế nội dung thẻ HTML bằng sed

HTML để tìm kiếm/thay thế trong:

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

lệnh sed sử dụng:

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

Điểm của việc này là để phân tích các trang HTML và cập nhật số liệu theo một số dữ liệu bên ngoài. Lần đầu tiên, nội dung của các thẻ sẽ trống, sau đó chúng sẽ được lấp đầy.


EDIT:

tôi đã kết thúc bằng một sự kết hợp các câu trả lời mà dẫn đến đoạn mã sau:

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

Nhiều nhờ @Sorpigal, @tripleee, @classic cho sự giúp đỡ!

+0

Đây là việc sử dụng mèo vô dụng – Sorpigal

+0

nhưng thay đổi "mèo" thành f.e. "ít" sẽ không thực sự giải quyết vấn đề của tôi bây giờ sẽ không? – Revell

+1

Không, nhưng 'sed '...' inputfile' sẽ, và là cách chính xác để thực hiện nếu bạn muốn sử dụng' sed -i'. – tripleee

Trả lời

5

Hãy thử điều này:

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

Điều này sẽ không thành công sau lần đầu tiên. Bạn cần phải khớp '[0-9] \ {0, \}' ở giữa các thẻ span. – Sorpigal

+0

Có, nếu nó được cho là để thay thế giá trị trong khoảng này cần phải được sửa chữa – classic

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

Tôi đã xóa Sử dụng vô dụng mèo, lấy ra một dấu gạch chéo ngược không cần thiết, thêm dấu nháy đơn xung quanh regex để bảo vệ nó khỏi mở rộng vỏ và cố định toán tử lặp lại. Bạn có thể vẫn cần phải gạch chéo các dấu ngoặc đơn nhóm; sed của tôi, ít nhất, muốn \ (... \).

Lưu ý việc sử dụng dấu nháy đơn và dấu ngoặc kép cạnh nhau. Dấu nháy đơn bảo vệ chống lại việc mở rộng vỏ, vì vậy bạn không thể sử dụng chúng xung quanh "$ {unlockedCount}", nơi bạn muốn trình bao để nội suy biến.

1

Những gì bạn nói rằng bạn muốn làm là không phải những gì bạn đang nói sed để làm.

Bạn muốn chèn số vào thẻ hoặc thay thế số đó nếu có. Những gì bạn đang cố gắng để nói sed cần làm là thay thế một thẻ span và nội dung của nó, nếu có hoặc một số, với giá trị của một biến hệ vỏ.

Bạn cũng đang sử dụng rất nhiều trình tự thoát phức tạp, khó chịu và dễ bị lỗi mà không cần thiết.

Dưới đây là những gì bạn muốn:

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

Lưu ý sự khác biệt:

  • Added -r bật biểu kéo dài mà không có mô hình chụp của bạn sẽ không hoạt động.
  • Được sử dụng | thay vì / làm dấu phân cách để thay thế để thoát / sẽ không cần thiết.
  • Trích dẫn một lần biểu thức sed để thoát những thứ bên trong nó khỏi vỏ sẽ không cần thiết.
  • Bao gồm thẻ span phù hợp trong phần thay thế để nó sẽ không bị xóa.
  • Để mở rộng biến số unlockedCount, đóng biểu thức được trích dẫn một lần, sau đó mở lại nó.
  • Đã thừa nhận cat | vô dụng ở đây.

Tôi cũng sử dụng dấu ngoặc kép xung quanh việc mở rộng biến vỏ, vì đây là thực hành tốt nhưng nếu không chứa khoảng trống thì điều này không thực sự cần thiết.

Nó không phải là, nói đúng, cần thiết cho tôi để thêm -r. Đồng bằng cũ sed sẽ hoạt động nếu bạn nói \([0-9]\{0,\}\), nhưng ý tưởng ở đây là để đơn giản hóa.

+0

-r không có vẻ là một lệnh sed hợp lệ? Trên Mac OS ít nhất. – Revell

+1

Trong MacOS X, công tắc để bật các biểu thức mở rộng sẽ khác nhau (có thể là '-E', kiểu BSD). '-r' là một công tắc GNU sed. – Sorpigal

Các vấn đề liên quan