2014-09-10 4 views
0

Мне нужно заменить каждый «_» на «-» в html-файле, но только в теге и только в атрибуте «name».Заменить символ только в определенной строке

Таким образом, каждый это:

<a name="menu_portlet_test"> or <a name="whatever_is_here"> 

должен стать этим:

<a name="menu-portlet-test"> and <a name="whatever-is-here"> 

не могу понять, как заставить что-то вроде СЕПГ/AWK, чтобы сделать это. Помогите!

+3

Разбор HTML с использованием sed/awk, избегайте, избегайте, избегайте. – anubhava

+0

Посмотрите на [этот ответ] (https://stackoverflow.com/a/1732454/1820501). –

+0

@ AvinashRaj: this '

' также соответствует –

ответ

2
sed ':a 
s/\(<[^>]* name="[^"]*\)_\([^"]*"\)/\1-\2/g;ta' YourFile 

Если сделать большинство из вас работы. Не совершенные из-за лучшие возможности HTML, но должно быть 99.9% нормально

объяснений

s//g

  • Поиск шаблона (< следует любому не > ([^>] ) followed by имени = "followed by (any non" ( [^ "])) [ as group 1] followed by[so firstbetween quote after name=] followed by (any non" ( [^ «] * ) followed by» `) [как группа 2]
  • Заменить его содержание группы 1 с последующим - с последующим содержанием группы 2
  • g сделать это для любого встречаемости на линии. Это изменение 1 _ для имени = "", но по любому имени = строки. <... name="bla_bla_bla"> ... <... name="other_bla_bla"> ... изменение <... name="bla-bla_bla"> ... <... name="other-bla_bla"> ...

ta

  • , если изменение происходит в предыдущем s//, повторить то же самое действие с измененным содержанием (на самом деле это, если/Гото маркировать :a)
+0

, похоже, делает трюк, спасибо, теперь мне нужно выяснить, как это работает :). EDIT: Aaah! петля, блестящая! – user1606576

+0

добавил комментарий для объяснения – NeronLeVelu

1

Используйте подходящий инструмент обработки HTML, например xsh, обертка вокруг Perl's XML::LibXML. Следующие команды могут быть сохранены в скрипте, или ввести из его интерактивной среды:

open :F html file.html ; 
for //@name set . xsh:subst(., '_', '-', 'g') ; 
save :b ; 
+0

Выглядит интересно, так же как эти команды запускаются из интерактивной оболочки? Возможно, более подробная информация в ответе будет полезна. –

+1

@TomFenech: Обновлено, спасибо. – choroba