Перейти к содержанию

[решено] поменять регистр между двумя тегами с помощью


Рекомендуемые сообщения

Привет.

Облазил весь инет и так не смог понять: возможно ли просто с помощью sed или аwk поменять регистр букв на нижний/верхний между двумя тегами в текстовом файле? Например в html-файле поменять все символы между тегами <body> и </body> на нижний регистр. Вся конструкция <body>заменяемый текст</body> может располагаться на нескольких строчках.

Ссылка на комментарий
Поделиться на другие сайты

sed и awk в основном предназначены, чтобы парсить текстовые файлы, разбитые на строки. Всякие xml лучше парсить перлом или питоном или еще чем-то для этого предназначенным. Там для этого есть и библиотеки.

Но вашу задачу можно решить, конечно, и через awk, например, так

gg@c-1:~$ cat 2lower.awk

BEGIN { flag = 0 }{  n1 = index($0, "<body>")  n2 = index($0, "</body>")  if ( n1 > 0 )    if (n2 > 0)      $0 = substr($0, 1, n1+5) tolower(substr($0,n1+6,n2-n1-6))  substr($0, n2)    else {      flag = 1      $0 = substr($0, 1, n1+5) tolower(substr($0,n1+6))     }  else    if (n2 >0) {      flag = 0      $0 = tolower(substr($0,1,n2-1))  substr($0, n2)    }    else      if (flag == 1) $0 = tolower($0)  print $0}
Ссылка на комментарий
Поделиться на другие сайты

Я вот так решил:

1. собираем все в одну строчку, заменяя \r\n на <@@@>

2.разбиваем заново так, чтобы на одной строчке оставался только один парный тег <body></body>

3. делаем необходимые замены

4. собираем снова в одну строчку

5. заменяем <@@@> на \r\n

@echo offset strSrc=a.htmlset strOpenTag=^<body^>set strCloseTag=^</body^>set strEOL=^<@@@^>sed ":a;N;$!ba;s/\n/%strEOL%/g" %strSrc% | ^sed "s:%strOpenTag%:\r\n\0:g" | ^sed "s:%strOpenTag%\(.*\)%strCloseTag%:%strOpenTag%\U\1\E%strCloseTag%:g" | ^sed ":a;N;$!ba;s/\n//g" | ^sed "s:%strEOL%:\r\n:g"

Я так понял, что для sed и awk - это общая практика форматировать текст так для начала, чтобы на одной строке были нужные простые конструкции

Ссылка на комментарий
Поделиться на другие сайты

plgrm44 писал(а) Срд, 12 Октябрь 2011 04:55

Я вот так решил: ...

Тоже вполне себе решение.

Цитата:

Я так понял, что для sed и awk - это общая практика форматировать текст так для начала, чтобы на одной строке были нужные простые конструкции

В общем, да. Они предназначены для разбора структурированных строк.

Но, тем не менее, они достаточно гибки.

Можно, к примеру, в той же задаче с awk всё в одну строку составить

BEGIN { RS = "\004"; ORS = "" }{  while (1) {    n1 = index($0, "<body>")    n2 = index($0, "</body>")    if (n1 && n2) {      print substr($0, 1, n1+5) tolower(substr($0, n1+6,n2-n1-6)) substr($0, n2, 7)      $0 = substr($0, n2+7)    }    else break  }  print $0}
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...