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} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.