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

Привет.

Облазил весь инет и так не смог понять: возможно ли просто с помощью 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>

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

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

  3. заменяем <@@@> на \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}