Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Выдернуть подстроку между разделителями из строки  (Прочитано 584 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн kduk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Всем привет!
Такая вот проблема,имеется файл, в котором данные вида
<a href="/qw/vb/123?ak=93&;>
и
<a href="/qw/vb/412?ak=118&;>
Как вытянуть через grep первые цифры (123 и 412)?

Пробовал так
grep -o '<a href="/qw/vb/*">' file.html | grep -o '^[^/]*'

но ничего не выводит вообще

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 1709
    • Просмотр профиля
Думаю, что с помощью grep не удастся, она же выводит строки целиком. Попробуйте cut.
Пётр.

Оффлайн ALiEN175

  • Старожил
  • *
  • Сообщений: 1831
  • X-9000SC
    • Просмотр профиля
grep -Eo 'vb\/[0-9]*\?' file.html | tr -cd 0-9\\n
« Последнее редактирование: 23 Февраль 2018, 18:38:39 от ALiEN175 »
45100

Оффлайн kduk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
grep -Eo 'vb\/[0-9]*\?' file.html | tr -cd 0-9\\n
Большое спасибо)

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1867
    • Просмотр профиля
Еще вариант:
perl -ne 'if(/<a href="\/qw\/vb\/(\d+)/){print "$1\n"}'
Помощь новичкам, написание скриптов на bash,sh,perl,awk (в ЛС)

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5486
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Код: Bash
  1. grep -Po 'a href="/qw/vb/\K\d{3}' file.html
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн kduk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Чтобы не плодить темы, напишу здесь)

Есть html файл, в котором данные вида:

<tr class="prop">
                <td class="name">Date Created</td>
                <td class="fil"></td>
               
                    <td class="value">2017-12-01 12:10:07 UTC</td>
  </tr>

            <tr class="prop">
                <td class="name">Date Deleted</td>
                <td class="fil"></td>
                <td class="value">2017-12-09 12:12:12 UTC</td>
            </tr>
grep "Date Deleted" myh.html - B 0 -A 3 | grep "[0-9]" | grep -op '>\K.*'
нужно вытянуть "2017-12-09" в идеале вообще получить строку "171209"
но пока у меня получилось вытянуть только "2017-12-09 12:12:12 UTC</td>"
подскажите, пожалуйста, как обрезать до пробела?
пробовал добавить в конце такую строку: grep -o '^[^[[:space:]]]*' но вытаскивает вообще только "2"

Оффлайн ALiEN175

  • Старожил
  • *
  • Сообщений: 1831
  • X-9000SC
    • Просмотр профиля
grep -A2 'Date Deleted' | tail -1 | grep -Eo '[0-9]{4}(\-[0-9]+){2}' | tr -d \-grep -A2 'Date Deleted' | tail -1 | tr -cd '[:digit:]' | cut -c1-8
45100

Оффлайн kduk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
grep -A2 'Date Deleted' | tail -1 | grep -Eo '[0-9]{4}(\-[0-9]+){2}' | tr -d \-grep -A2 'Date Deleted' | tail -1 | tr -cd '[:digit:]' | cut -c1-8
спасибо большое  :)

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5486
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Код: Bash
  1.  sed -n '
  2.    /Date Deletedl/! d;
  3.    :1;
  4.    n;
  5.    /.*value"\?>[0-9][0-9]/! b1;
  6.    s///;
  7.    s/-//g;
  8.    s/ /\n/;
  9.    P'
Однако повторю еще раз: "Работать с html/xml надо специализированными инструментами"

Пользователь добавил сообщение 06 Март 2018, 16:25:29:
Код: Bash
  1. grep -A2 'Date Deleted' | grep -Eo '[0-9]{2}(\-[0-9]+){2}' | tr -d \-
tail тут не только не нужен, но и опасен - если дат несколько
получить строку "171209"
« Последнее редактирование: 14 Март 2018, 19:52:02 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн kduk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Продолжу  ;D

Теперь идея другая, а можно ли grep-ом вытянуть сразу два значения? Просто при обычном использоваии грепа, например на дату, греп записывает целый массив дат в файл и нет возможности сделать соответствие между датой и номером (которому эта дата соответсвтует), кроме как писать в один файл номер, а в другой дату и просто поочереди их брать. Но я боюсь ситуации, когда дата будет отсутствовать и все даты в файле съедут и нарушится соответствие.

 <td>
            <a href="/qw/vb/123?ak=blabla3">
                                Qwert
                            </a>
                        </td>

 <td class="value">2017-12-09 12:12:12 UTC</td>

<td>
            <a href="/qw/vb/456?ak=asdfg">
                                Qwert2
                            </a>
                        </td>

 <td class="value">2018-01-20 10:10:12 UTC</td>

Представляю себе конечный файл типа такого:
123 171209
456 180120
Но это не принципиально, мне главное знать к какому номеру какая дата. Или может можно как-то отследить что даты нет и вместо неё, например, установить ноль и дальше проверять не равно ли нулю.


P.S: Это не моё решение использовать для html bash, мне просто не дают выбирать)


Пользователь добавил сообщение 13 Март 2018, 19:28:43:
А ещё лучше бы 3 значения, чтобы записывать в файл так (в каком порядке будут слова не важно, главное чтобы все в одном)

123 171209 blabla3
456 180120 asdfg
« Последнее редактирование: 13 Март 2018, 19:28:43 от kduk »

Оффлайн ALiEN175

  • Старожил
  • *
  • Сообщений: 1831
  • X-9000SC
    • Просмотр профиля
grep не подойдет: читайте файл построчно, записывая нужные значения в переменные и файл.
Сделать проверку на отсутствие данных - несложно.
45100

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1867
    • Просмотр профиля
Если данных не гигабайты, использовать файлы смысла нет никакого.
Эта задача элементарно решается использованием хэшей (ассоциативных массивов) например на языках Perl, Awk, Python.
Помощь новичкам, написание скриптов на bash,sh,perl,awk (в ЛС)

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5486
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Код: Bash
  1.  sed '
  2.    /.*qw\/vb\//!d;
  3.    s///;
  4.    :1;
  5.    N;
  6.    /value/!b1;
  7.    s/?[^\n]*=/ /;
  8.    s/\W*\n.*>[0-9][0-9]/ /;
  9.    s/ [0-9][^-]*$//;
  10.    s/-//g
  11.    '  
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.206 секунд. Запросов: 23.