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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

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

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

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

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6754
  • 20% Cooler
    • Просмотр профиля
grep -Eo 'vb\/[0-9]*\?' file.html | tr -cd 0-9\\n
« Последнее редактирование: 23 Февраля 2018, 17:38:39 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн kduk

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

Оффлайн ReNzRv

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: (bash) [Выделить]
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"

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6754
  • 20% Cooler
    • Просмотр профиля
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
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

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

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: (bash) [Выделить]
sed -n '
    /Date Deletedl/! d;
    :1;
    n;
    /.*value"\?>[0-9][0-9]/! b1;
    s///;
    s/-//g;
    s/ /\n/;
    P'
Однако повторю еще раз: "Работать с html/xml надо специализированными инструментами"

Пользователь добавил сообщение 06 Марта 2018, 15:25:29:
Код: (bash) [Выделить]
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 »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6754
  • 20% Cooler
    • Просмотр профиля
grep не подойдет: читайте файл построчно, записывая нужные значения в переменные и файл.
Сделать проверку на отсутствие данных - несложно.
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн ReNzRv

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: (bash) [Выделить]
sed '
    /.*qw\/vb\//!d;
    s///;
    :1;
    N;
    /value/!b1;
    s/?[^\n]*=/ /;
    s/\W*\n.*>[0-9][0-9]/ /;
    s/ [0-9][^-]*$//;
    s/-//g
    ' 
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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