plgrm44 Опубликовано 5 октября, 2011 Жалоба Опубликовано 5 октября, 2011 Привет. Облазил весь инет и так не смог понять: возможно ли просто с помощью sed или аwk поменять регистр букв на нижний/верхний между двумя тегами в текстовом файле? Например в html-файле поменять все символы между тегами <body> и </body> на нижний регистр. Вся конструкция <body>заменяемый текст</body> может располагаться на нескольких строчках. Цитата
gogi Опубликовано 11 октября, 2011 Жалоба Опубликовано 11 октября, 2011 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} Цитата
plgrm44 Опубликовано 12 октября, 2011 Автор Жалоба Опубликовано 12 октября, 2011 Я вот так решил: 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 - это общая практика форматировать текст так для начала, чтобы на одной строке были нужные простые конструкции Цитата
gogi Опубликовано 12 октября, 2011 Жалоба Опубликовано 12 октября, 2011 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} Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.