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

**URL:** <https://linux.ru/forum/t/topic/9703>\
**Category:** Программирование: \*nix\
**Created:** [05.Октябрь.2011 07:46:12 UTC](https://linux.ru/forum/t/topic/9703 "2011-10-05T07:46:12Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![plgrm44](https://linux.ru/forum/letter_avatar_proxy/v4/letter/p/7bcc69/32.png) [@plgrm44](https://linux.ru/forum/u/plgrm44)\
**Post date:** [05.Октябрь.2011 07:46:12 UTC](https://linux.ru/forum/t/topic/9703/1 "2011-10-05T07:46:12Z")

</div>

Привет.

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

---

<div class="post-metadata">

**Author:** ![gogi](https://linux.ru/forum/letter_avatar_proxy/v4/letter/g/958977/32.png) [@gogi](https://linux.ru/forum/u/gogi)\
**Post date:** [11.Октябрь.2011 19:27:09 UTC](https://linux.ru/forum/t/topic/9703/2 "2011-10-11T19:27:09Z")

</div>

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}

```

---

<div class="post-metadata">

**Author:** ![plgrm44](https://linux.ru/forum/letter_avatar_proxy/v4/letter/p/7bcc69/32.png) [@plgrm44](https://linux.ru/forum/u/plgrm44)\
**Post date:** [12.Октябрь.2011 00:55:45 UTC](https://linux.ru/forum/t/topic/9703/3 "2011-10-12T00:55:45Z")

</div>

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

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

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

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

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

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

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

---

<div class="post-metadata">

**Author:** ![gogi](https://linux.ru/forum/letter_avatar_proxy/v4/letter/g/958977/32.png) [@gogi](https://linux.ru/forum/u/gogi)\
**Post date:** [12.Октябрь.2011 18:00:39 UTC](https://linux.ru/forum/t/topic/9703/4 "2011-10-12T18:00:39Z")

</div>

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}

```
