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


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

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

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

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

Оффлайн ALiEN175

  • Старожил
  • *
  • Сообщений: 1971
  • X-9000SC
    • Просмотр профиля
grep -Eo 'vb\/[0-9]*\?' file.html | tr -cd 0-9\\n
« Последнее редактирование: 23 Февраль 2018, 17:38:39 от ALiEN175 »
M5A78L-M LX3 : AMD FX-4330 : 16 Gb RAM : AMD Radeon R7 260x
Samsung N150 : Intel Atom N450 : 2 Gb RAM : Intel GMA 3150

Оффлайн kduk

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

Оффлайн ReNzRv

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5605
  • 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

  • Старожил
  • *
  • Сообщений: 1971
  • 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
M5A78L-M LX3 : AMD FX-4330 : 16 Gb RAM : AMD Radeon R7 260x
Samsung N150 : Intel Atom N450 : 2 Gb RAM : Intel GMA 3150

Оффлайн 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

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5605
  • 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, 15:25:29:
Код: Bash
  1. grep -A2 'Date Deleted' | grep -Eo '[0-9]{2}(\-[0-9]+){2}' | tr -d \-
tail тут не только не нужен, но и опасен - если дат несколько
получить строку "171209"
« Последнее редактирование: 14 Март 2018, 18: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, 18:28:43:
А ещё лучше бы 3 значения, чтобы записывать в файл так (в каком порядке будут слова не важно, главное чтобы все в одном)

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

Оффлайн ALiEN175

  • Старожил
  • *
  • Сообщений: 1971
  • X-9000SC
    • Просмотр профиля
grep не подойдет: читайте файл построчно, записывая нужные значения в переменные и файл.
Сделать проверку на отсутствие данных - несложно.
M5A78L-M LX3 : AMD FX-4330 : 16 Gb RAM : AMD Radeon R7 260x
Samsung N150 : Intel Atom N450 : 2 Gb RAM : Intel GMA 3150

Оффлайн ReNzRv

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5605
  • 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.084 секунд. Запросов: 24.