Редактирование нескольких файлов HTML с использованием SED (или чего-то подобного)
У меня есть около 1000 HTML-файлов для редактирования, которые представляют сноски в большом техническом документе. Меня попросили просмотреть HTML-файлы один за другим и вручную отредактировать HTML-код, чтобы получить все сразу и по-узкому.
Я знаю, что это может быть сделано в считанные секунды с помощью SED, поскольку изменения в каждом файле похожи. Текст в каждом файле может быть разным, но я хочу изменить теги, чтобы они соответствовали следующему:
See R v Swain (1992) 8 CRNZ 657 (HC).
Текст может измениться, например, он может сказать: «Смотрите R v Pinky and the Brain (1992)» или что-то в этом роде, но в основном это должен быть основной текст.
В настоящее время, однако, основной текст может быть:
See R v Pinky and the Brain (1992)
See R v Pinky and the Brain (1992)
Кто-нибудь может предложить выражение SED или что-то подобное, чтобы решить эту проблему?
5 ответов
Для объединения тегов span вы также можете использовать tidy (версия выпущена 25 марта 2009 г.)!
# get current tidy version: http://tidy.cvs.sourceforge.net/viewvc/tidy/tidy/ # see also: http://tidy.sourceforge.net/docs/quickref.html#merge-spans tidy -q -c --merge-spans yes file.html
perl -pe 's/Swain/Pinky and the Brain/g;' -i lots.html of.html files.html
- -e = «Использовать код в командной строке»
- -p = «Выполнить код в каждой строке каждого файла и распечатать строку, включая то, что изменилось»
- -i = «Фактически заменить файлы новым содержимым»
Если вы меняете -i с -i.old тогда в файлах lots.html.old и of.html.old (и т. д.) будут храниться файлы до внесения изменений, если вам необходимо вернуться назад.
Это заменит просто Swain с Pinky and the Brain во всех файлах. Дальнейшие изменения потребуют больше запусков команды. Или же:
s/Swain/Pinky/g; s/Twain/Brain/g;
Поменять местами Суэйна с Пинки и Твена с Мозгом.
Если вы можете быть уверены в входящем форматировании данных, тогда может быть достаточно чего-то подобного:
# cat ff.html See R v Twain (1992)
See R v Swain (1992)
# perl -pe 'BEGIN s/<[pP][ >].*?See (.*?)(.*?)<.*?\/[pP]>/See $1$2/gsm;' ff.html
See R v Twain (1992)
See R v Swain (1992)
- BEGIN = обрабатывать весь документ как одну строку, иначе HTML, в котором есть переводы строк, не будет обработан должным образом
- <[pP[ >] = начало p-тега (без учета регистра)
- .*? = много вещей, несоответствующих друг другу, т.е. http://en.wikipedia.org/wiki/Regular_expression
- See = буквально искать эту строку — очень важно, так как это, кажется, единственный общий знаменатель
- (.*?) = положить больше материала в группу скобок (будет использоваться позже)
- = конец i-тега
- (.*?) = положить больше материала в группу скобок (будет использоваться позже)
- <.*?\/[pP] = конечный p-тэг и другие возможные тэги перед ним (как и все ваши промежутки)
- и замените его на строку, которую вы хотите, где $1 и $2 — это то, что было зацеплено в скобках, то есть два (.*?) «s
- g = глобальный поиск — возможно, более одного на строку
- s = обрабатывать все как одну строку (что теперь происходит из-за BEGIN на вершине)
Сначала преобразуйте ваши HTML-файлы в правильный XHTML, используя http://tidy.sourceforge.net/ а затем используйте xmlstarlet для выполнения необходимой обработки XHTML.
Примечание. Получите текущую версию xmlstarlet для редактирования XML-файла на месте.
Вот простой, но полный мини-пример:
curl -s http://checkip.dyndns.org > dyndns.html tidy -wrap 0 -numeric -asxml -utf8 2>/dev/null < dyndns.html >dyndns.xml # test: print body text to stdout (dyndns.xml) xml sel -T \ -N XMLNS="http://www.w3.org/1999/xhtml" \ -t -m "//XMLNS:body" -v '.' -n \ dyndns.xml # edit body text in-place (dyndns.xml) xml ed -L \ -N XMLNS="http://www.w3.org/1999/xhtml" \ -u "//XMLNS:body" -v ' ' \ dyndns.xml # create new HTML file (by overwriting the original one!) xml unesc < dyndns.xml >dyndns.html
Вам нужно будет проверить свои входные файлы, чтобы убедиться, что некоторые предположения могут быть сделаны. Основываясь на ваших двух примерах, я сделал следующие предположения. Вам нужно будет проверить их и взять несколько примеров входных файлов, чтобы убедиться, что вы нашли все предположения.
- Файл состоит из одной сноски, содержащейся в одной пара. Метки тела всегда присутствуют и хорошо сформированы.
- Сноска похоронена где-то внутри пара и один или много теги. теги могут быть отброшены.
Следующий скрипт Perl работает для обоих предоставленных вами примеров (в Linux с Perl 5.10.0). Перед использованием убедитесь, что у вас есть резервная копия ваших оригинальных файлов HTML. По умолчанию результат будет напечатан только на стандартный вывод без изменения какого-либо файла.
#!/usr/bin/perl $overwrite = 0; # get rid of default line separator to facilitate slurping in a $scalar var $/ = ''; foreach $filename (@ARGV) < # slurp entire file in $text variable open FH, "; close FH; if ($overwrite) < ! -f "$filename.bak" && rename $filename, "$filename.bak"; ># match everything that is found before the body tag, everything # between and including the body tags, and what follows # s modifier causes full_text to be considered a single long string # instead of individual lines ($before_body, $body, $after_body) = ($full_text =~ m!(.*)(.*)(.*)!s); #print $before_body, $body, $after_body; # Discard unwanted tags from the body $body =~ s%%%sg; $body =~ s% %%sg; $body =~ s%%%sg; $body =~ s% %%sg; $body =~ s%%%sg; # Remaining leading and trailing whitespace likely to be newlines: remove $body =~ s%^\s*%%sg; $body =~ s%\s*$%%sg; if ($overwrite) < open FH, ">$filename"; print FH $before_body, "\n else < print $before_body, "\n >
./script.pl file1.html ./script.pl file1.html file2.html ./script.pl *.html
Настройте его, и когда вы будете довольны, установите $overwrite=1. Сценарий создает.bak, только если он еще не существует.
Как сразу заменить код во всех html файлах
Добрый вечер всем!
Сделала сайт на html (без движка, такое было требование заказчика), в сайте 700 страниц. По ходу дела в header и footer внесли много переделок по мере верстки, страницы получились неодинаковыми. И вот теперь нужно все эти изменения разбросать по всем 700 страницам. Знаю про программу словоед, но она почему-то не берет, может проблема в кодировке, она новая utf-8. Кто знает, подскажите, плз, спец программу или если есть штатные средства дримвьювера или Notpad++, чтобы можно было автоматически все заменить? Спасибо заранее.
Вставить(заменить) код(текст) в нескольких html файлах
Есть много-много html файлов. Структура у них одна. Мне необходимо их изменить, вставив в.
Заменить тег HTML файла именем файла во всех файлах папки
Как заменить содержимое тегов <title> HTML файлов именами соответствующих файлов во всех файлах.
Как в папке заменить текст во всех файлах?
в папке несколько txt файлов, имеющие одну и ту же структуру. в них необходимо заменить.
Замена текста во всех html файлах
import os import codecs import time def get_html(link): file_name = link .
Даже если и есть, вам придется подать на вход 700 страниц. Могут быть ошибки.
В данном случае, я бы писал сам код и менял с помощью него то что нужно.
Но я бы открестился от такого проекта. Или пусть платит много денег вам, за адский труд!
Сообщение от sheila
TextCrawler is a fantastic tool for anyone who works with text files. This cool utility enables you to instantly find and replace words and phrases across multiple files and folders. It utilises a powerful Regular Expression engine to enable you to create sophisticated searches, preview replace, perform batch operations, extract text from files and more. It is fast and easy to use, and as powerful as you need it to be.
Ошибки при таком темпе и объеме работы быть обязаны)) лишь бы не критичные.
Gazlan, спасибо большое за прогу! По описанию то, что надо, буду тестить
Я бы написал для этого скриптик.
Но 700 страниц без хотя бы простейшей CMS это бред, не указаны причины этого извращения?
Логично было бы хранить тело страницы в файлах, а шапку и футер дописывать скриптом)
Taatshi, большое спасибо за подсказку! Я начала в дримвьювере делать (держу его из-за денвера), собрала все файлы для замены в отдельную папку и выбираю ее при замене. Дримвьювер, странно, ругается, но меняет. Завтра на работе попробую на notepad++, может, ругаться не будет.
Tmin100, вот программист наш тоже сказал, что это бред и заставил меня убрать все повторы (footer, header и sidebar в js файлы, которые я подключила в макет. Сначала хотели инклюдить html, но потом решили, что js лучше кешируется и меньше траффика ест. А причина в том, что шеф боится потерять позиции в SEO. Он считает, что при постановке на CMS сайт падает.
Petya, сайт пока на локалке, завтра, если все пройдет хорошо с заменой, будем заливать))
Сообщение от sheila
Интересный у вас шеф Не корректно, наверное, шефу предлагать читать про индексацию поисковиками сайтов .
Я очень хочу поглядеть на сие чудо!
Я для себя позже хочу то же страничку сверстать, на голом HTML
Массовая замена части кода в большом количестве html-файлов
Доброй ночи! Озадачен таким вот квестом: 1) куплен статический сателит, примерно 150 страниц, все сделаны на чистом хтмл (не движок) 2) нужно вставить код яндекс.директа и счетчиков, а так же ссылки на все страницы сателита Как Вы понимаете, в ручную менять 150 файлов — очень лениво. Собственно ищется какой-либо софт, который готов на автомате найти во всех файлах нужный кусок кода и добавить туда пару строк. Заранее спасибо за помощь.
lazyqwe:
Доброй ночи!
Озадачен таким вот квестом:
1) куплен статический сателит, примерно 150 страниц, все сделаны на чистом хтмл (не движок)
2) нужно вставить код яндекс.директа и счетчиков, а так же ссылки на все страницы сателита
Как Вы понимаете, в ручную менять 150 файлов — очень лениво. Собственно ищется какой-либо софт, который готов на автомате найти во всех файлах нужный кусок кода и добавить туда пару строк.
Заранее спасибо за помощь.
Macromedia HomeSite Умеет производить автоматически замену любого кода, не только HTML, в любом количестве файлов.
Если есть SSH доступ можно таким способом: replace ‘строчка_которую _меняем’ ‘на_что_меняем’ — /home/логин/путь_к_папке/*
Если шелла нет, но есть пхп, можно за 5 минут написать простенький скриптик, который переколбасит все файлики. Только права перед и после процедуры на файлики надо будет поменять.
lazyqwe:
Доброй ночи!
Озадачен таким вот квестом:
1) куплен статический сателит, примерно 150 страниц, все сделаны на чистом хтмл (не движок)
2) нужно вставить код яндекс.директа и счетчиков, а так же ссылки на все страницы сателита
Как Вы понимаете, в ручную менять 150 файлов — очень лениво. Собственно ищется какой-либо софт, который готов на автомате найти во всех файлах нужный кусок кода и добавить туда пару строк.
Заранее спасибо за помощь.
Не парься. Пришли мне на мыло в .zip свои файлы и код, который нужно вставить. Не забуть сказать, в каком месте оно должно быть. Я вставлю и отправлю обратно. 🙂
Как при помощи php массово вносить изменения в html файлы в modx?
Можно ли написать php код, который бы находил во всех статичных файлах код калькулятора и позволял бы совершать арифметические действия со значением value?
Если «да», то какой именно код?
Средний 5 комментариев
Можно ли написать php код, который бы находил во всех статичных файлах код калькулятора и позволял бы совершать арифметические действия со значением value?
в каких статичных файлах? И в чем смысл этого велосипеда? Уверен можно сделать проще и правильнее, если опишите задачу чуть понятнее
Danny Arty,
Ну да, на сайте, реализованном через modx.
У меня каждый шаблон привязан к статичному файлу. И в нескольких тысячах файлах (и, соответственно, в шаблонах) есть html код, который выводит табличку с калькулятором стоимости услуг. Где цена услуги в value. На разных страницах цены отличаются друг от друга. И нет инструмента, который бы позволил, например, понизить все цены на 20%. И поэтому я ищу способ при помощи php выполнять арифметические операции с value на всех страницах
если бы цены были в бд — инструмент есть — сама бд
несколько тысяч страниц могут спокойно жить на одном шаблоне с переменными, связанными с бд
Отвечу, что в твоем случае — никак.
Сергей Шевцов, ааа, теперь понятно. Ну можно плагином на событие OnWebPagePrerender например подменять значения перед выводом. В файле все останется как есть, но уже во фронте будет указываться другое значение.
Написать на PHP скрипт, который поменяет значения в html-файлах вполне реально, а MODX тут уже ни при чем. Если задали бы этот вопрос с тегом PHP, то возможно получили бы ответ. Но что бы решить эту задачу правильно на 100%, надо как-то отсеять ненужные импуты. А сделать это можно только имея все файлы с шаблонами.