LINUX.ORG.RU

sed, часть 1

 


0

1

Мне нужно в первой строке удалить все до второго «>» включительно.

sed -e "1,s/.*>\(.*\)$/\1/2" $ProgramPath$PagesPath$TempFileName > $ProgramPath$PagesPath$TempFileName2; #мопед не мой.
sed: -e выражение #1, символ 3: непредвиденный символ `,'

man sed. Когда заменяешь диапазон строк на одну строку, то и запятую удалять надо

sed -e «1s/.*>\(.*\)$/\1/2» $ProgramPath$PagesPath$TempFileName > $ProgramPath$PagesPath$TempFileName2

Выдача sed'а тебе как бы подсказывала где была допущена ошибка.

kim-roader ★★
()
Ответ на: комментарий от AlexCones

Спасибо, ошибка пропала, но удаления всего до второго «>» не происходит.

info sed 'The «s» Command'. Модификатор «2» для команды «s/.../.../2» значит, что заменено будет второе совпадение. С твоим регекспом (который удаляет текст до последнего «>», а не до второго) возможно только одно совпадение. Удали модификатор.

kim-roader ★★
()
Ответ на: комментарий от sdio

Я могу, конечно, свою внешнюю утилиту написать, но это же будет некошеrно. Что есть из нативного, чтобы можно было и href и содержимое тегов считать?

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

Возьми ruby + nokogiri (apt-get install libnokogiri-ruby) и прекрасно разберешь ЛОР на составляющие

вот пример которым я разбираю темы для заполнения базы неофициальной статистики. до идеала далеко, но работает.

#!/usr/bin/ruby
# coding: utf-8

require 'nokogiri'
require 'fileutils'
#require 'open-uri'

def getuser(signdiv)
        sign = signdiv.css('a')
        if sign.first.nil? then
                user = 'anonymous'
        else
                user = sign.first.content.strip
        end
  user
end

def getstars(signdiv)
        stars = 0
        grey  = 0
        rs = Regexp.new('star')
        rg = Regexp.new('grey-star')
        imgs = signdiv.css('img')
        imgs.each do |img|
                strsrc = img.get_attribute('src')
                if not rs.match(strsrc).nil? then
                        stars = stars + 1
                        if not rg.match(strsrc).nil? then
                                grey = grey + 1
                        end
                end
        end
  return stars, grey
end

def getdate(signdiv)
        rd = Regexp.new('\(([^)]+)\)')
        if signdiv.nil? then
                warn "Error: Sign is empty"
                return nil
        end
        
        date1 = rd.match(signdiv.content)
        rd2 = Regexp.new('([0-9]+)\.([0-9]+)\.([0-9]+) +(.*)')
        date2 = rd2.match(date1[1])
  return "#{date2[3]}-#{date2[2]}-#{date2[1]} #{date2[4]}"
end

def msgtype(msg)
        rt = Regexp.new('topic')
        mstype = msg.get_attribute('id')
        if rt.match(mstype).nil? then
                mtype = "comment"
                rt = Regexp.new('([0-9]+)')
                msgid = rt.match(mstype)[1]
        else
                mtype = "topic"
                rt = Regexp.new('([0-9]+)')
                msgid = rt.match(mstype)[1]
        end
        return mtype, msgid
end

def typeoftopic(title)
        rf = Regexp.new('(.+?) - (.+?) - (.*)')
        x = rf.match(title)
        if not x.nil? then
                if x[1] == 'Новости' then
                        return x[1], 'news', x[3].tr("'", 'י')
                end
                if x[1] != 'Форум' then
                        return x[1], 'none', x[3].tr("'", 'י')
                end
                return x[1], x[2], x[3].tr("'", 'י')
        end
 return nil, nil, nil
end


#doc = Nokogiri::HTML(File.open('html/6723812.html'), nil, 'UTF-8')

ARGV.each do |htmlfile|
        warn htmlfile
        doc = Nokogiri::HTML(File.open(htmlfile), nil, 'UTF-8')


        title = doc.css('title').first.content
        cat, subcat, subj = typeoftopic(title)
        #printf("Раздел: %s, Подраздел: %s, Тема: %s\n", cat, subcat, subj)
        puts 'BEGIN TRANSACTION;'

        doc.css('article.msg').each do |msg|
                msign = msg.css('div.sign')
                if msign.first.nil? then
                        warn "Ignored message"
                else
                        msign = msign.first
                        stotal, sgrey = getstars(msign)
                        mestype, msgid = msgtype(msg)
                        mdate = getdate(msign)
                        if mdate.nil? then
                                warn "Message id #{msgid}"
                        end
                        printf("INSERT OR IGNORE INTO lorstat (msgid,category,subcat,subject,nick,msgdate,stars,grey,msgtype) VALUES (%d, '%s', '%s', '%s', '%s', '%s', %d, %d, '%s' );\n", msgid, cat, subcat, subj, getuser(msign), getdate(msign), stotal, sgrey, mestype)
                end
        end
        puts 'COMMIT;'
        FileUtils.mv(htmlfile, "del#{htmlfile}")
end

sdio ★★★★★
()
Ответ на: комментарий от sdio

У меня нет в системе ни ruby ни nokogirl. Полагаю, что у 80% ЛОРа тоже. Тянут по зависимостям коло десятка мегабайт. Не много ли для такой мелочи?

// Ушел писать утилиту.

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

Полагаю, что у 80% ЛОРа тоже

Я уверен что ты ошибаешься.

Ушел писать утилиту.

Вольному воля. Твоя поделка проживет неделю с аудиторией в 2.5 пользователя. Поверь, я знаю о чем говорю.

sdio ★★★★★
()
Ответ на: комментарий от AlexCones

Оно всю строку снесло.

Потому что твой регексп, как я уже сказал, сносит всё до последнего символа «>». Если хочешь парсить html регекспами, то хотя бы почитай как они пишутся.

kim-roader ★★
()
Ответ на: комментарий от sdio

Я уверен что ты ошибаешься

Я уверен что он прав. Раби устанавливает далеко не каждый. С другой стороны perl и python сейчас ставятся почти во всех GNU/Linux дистрибутивах и под них тоже есть модули умеющие html

kim-roader ★★
()
Ответ на: комментарий от kim-roader

Пофиг чем, лишь бы не регекспами. И мне очень интересно что товарищ-автор, собирается за «свой утиль» писать?

sdio ★★★★★
()
Ответ на: комментарий от AlexCones

Что есть из нативного, чтобы можно было и href и содержимое тегов считать?

Я так понимаю там только ascii? Если xhtml, то можно xmllint --xpath ... (html же можно конвертнуть, или попробовать xmllstarlet).

anonymous
()
Ответ на: комментарий от sdio

Парсить html регулярками - стильно, модно и молодёжно.

Библиотеки придумали тупицы!

:3

Hoodoo ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.