Существует ошибка панели запуска о Ubuntu, загружающейся с подсветкой ноутбука прочь; это могло бы быть проблемой, которую Вы видите.
Если Вы только хотите ...
из всех <tr>...</tr>
сделайте:
grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE
Поскольку мультилиния делает:
tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE
Проверьте HTMLFILE сначала символа "|" (не обычный, но возможный) и если он существует, изменение в том, которое не существует.
У Вас действительно есть требование, которое гарантирует синтаксический анализатор HTML: необходимо проанализировать HTML. HTML Perl:: TreeBuilder, BeautifulSoup Python и другие просты в использовании, легче, чем запись сложных и хрупких регулярных выражений.
perl -MHTML::TreeBuilder -le '
$html = HTML::TreeBuilder->new_from_file($ARGV[0]) or die $!;
foreach ($html->look_down(_tag => "tr")) {
print map {$_->as_HTML()} $_->content_list();
}
' input.html
или
python -c 'if True:
import sys, BeautifulSoup
html = BeautifulSoup.BeautifulSoup(open(sys.argv[1]).read())
for tr in html.findAll("tr"):
print "".join(tr.contents)
' input.html
sed
и awk
не хорошо подходят для этой задачи, необходимо скорее использовать надлежащий синтаксический анализатор HTML. Например, hxselect
из w3.org:
<htmlfile hxselect -s '\n' -c 'tr'
hxselect
делает довольно хорошее задание с правильно построенными html/xml документами. Кроме того, это быстрее для использования, чем жемчуг, Python и другие. Я думаю hxselect
хороший компромисс между sed
/awk
и синтаксический анализатор освобождает.
– Thor
13.02.2013, 15:00
hxselect
хорошие взгляды, определенно исследует его больше.Спасибо. сам
– TechJack
13.02.2013, 19:16
hxnormalize
заботится о не правильно построенный HTML/XML-файлы.
– tokland
17.11.2016, 13:37
Если ruby
доступно, можно сделать следующее
ruby -e 'puts readlines.join[/(?<=<tr>).+(?=<\/tr>)/m].gsub(/<\/?tr>/, "")' file
где file
Ваш входной файл HTML. Команда выполняет остроту Ruby. Во-первых, это читает все строки из file
и соединяет их со строкой, readlines.join
. Затем от строки это выбирает что-либо между (но не включая) <tr>
и <\/tr>
это - один символ или дольше независимо от новых строк, [/(?<=<tr>).+(?=<\/tr>)/m]
. Затем это удаляет любого <tr>
или </tr>
от строки, gsub(/<\/?tr>/, "")
(это необходимо для вложенного дескриптора tr
теги). Наконец, это печатает строку, puts
.
Вы сказали, что синтаксический анализатор HTML не гарантирован для Вас, но это - очень простой в использовании Nokogiri с ruby
и это делает команду более простой.
ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).xpath("//tr").map { |e| e.content }' file
-rnokogiri
загрузки Nokogiri. Nokogiri::HTML(readlines.join)
чтения все строки file
. xpath("//tr")
выбирает каждый tr
элемент и map { |e| e.content }
выбирает содержание для каждого элемента, т.е. между чем <tr>
и </tr>
.
grep
Чтобы получить содержимое внутри тега tr
по нескольким строкам, сначала пропустите его через xargs
, например:
curl -sL https://www.iana.org/ | xargs | egrep -o "<tr>.*?</tr>"
Чтобы вернуть только внутренний HTML, используйте:
curl -sL https://www.iana.org/ | xargs | grep -Po "<tr>\K(.*?)</tr>" | sed "s/..tr.//g"
Проверьте синтаксис для расширенных шаблоновperlre
.
Примечание. :Для повышения производительности вы можете использовать ripgrep
, который имеет аналогичный синтаксис.
pup
Пример использования pup
(, в котором используются селекторы CSS):
pup -f myfile.html tr
Чтобы напечатать только текст без тегов, используйте:pup -f myfile.html tr text{}
.
Вот несколько примеров сcurl
:
curl -sL https://www.iana.org/ | pup tr text{}
pup -f <(curl -sL https://www.iana.org/) tr text{}
xpup
Пример использованияxpup
для синтаксического анализа HTML/XML (с поддержкой XPath):
xpup -f myfile.html "//tr"
если это просто краткий список <tr>
s, это может помочь:
perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log
ура
echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'
даетfooblabar
.bla
не должен ли быть? – N.N. 13.02.2013, 14:03grep -Po '<tr>.*?</tr>'
возвратил бы один результат на строку в случае @N.N., но это не портативно. – l0b0 13.02.2013, 14:15