Grep - строка, которая начинается и заканчивается заранее определенным символом

Я пытаюсь получить строку из файла file.txt, которая выглядит так:

>This is line 1.</li> >This is line 2.</li> >This is line 3.</li> >This is line 4.</li>

Мне нужно получить контент, который начинается с > и заканчивается на </li>, поэтому выход будет This is line 1. This is line 2. и так далее. Я изучил это на форуме, но не нашел решение. Это решение также не сработало.

В конечном итоге мне нужно получить некоторые строки с веб-страницы. Поэтому сначала я буду curl webpage, а затем используйте команду grep для grep этой строки, которая начинается с > и заканчивается на </li>.

Спасибо.!

1
задан 12 August 2017 в 07:46

6 ответов

Это должно быть достаточно:

grep '^>.*</li>$' input-file

^ и $ гарантируют, что эти части привязаны к началу и концу строк соответственно.

Вы может также выполняться:

grep -x '>.*</li>' input-file

-x ищет точное соответствие: вся строка должна соответствовать шаблону (что подразумевает, что ^ и $ обернуты вокруг шаблона). [!d4 ]

2
ответ дан 22 May 2018 в 19:32
  • 1
    Привет спасибо. Он работает, но не работает при добавлении контента с веб-страницы. Например: view-source:http://goodmorningmylove.com/best-romantic-love-quotes-for-her-from-the-heart/ с этой страницы я хочу извлечь это между текстом >In a sea of people, my eyes will always be searching for you.</li>. Я сначала сделал curl webpage > file.txt и сохранил его в файле .txt, теперь, когда grep не показывал результата – S Andrew 12 August 2017 в 08:17
  • 2
    @SAndrew "View Source " браузера показывает очищенный вид источника (он намеревается и разбивает теги на несколько строк). Вы посмотрели фактический file.txt, чтобы проверить, соответствует ли это тому, что вы видите в браузере? Кроме того, страницы могут содержать динамически сгенерированный контент с использованием JavaScript и т. Д., И вы не увидите этого, когда curl на странице. – Olorin 12 August 2017 в 08:21
  • 3
    Я проверил file.txt и большинство совпадений, но не уверен. Тогда какой может быть лучший способ извлечь данные (скопировать строку) с любой веб-страницы. – S Andrew 12 August 2017 в 08:23
  • 4
    @SAndrew использует инструмент, который понимает HTML, например Pup: github.com/EricChiang/pup – Olorin 12 August 2017 в 08:25
  • 5
    Я думаю, что решение grep, упомянутое в @Olorin, довольно ясно, что с этим не так? – solfish 12 August 2017 в 09:36

Это должно быть достаточно:

grep '^>.*</li>$' input-file

^ и $ гарантируют, что эти части привязаны к началу и концу строк соответственно.

Вы может также выполняться:

grep -x '>.*</li>' input-file

-x ищет точное соответствие: вся строка должна соответствовать шаблону (что подразумевает, что ^ и $ обернуты вокруг шаблона).

3
ответ дан 18 July 2018 в 08:38

Это должно быть достаточно:

grep '^>.*</li>$' input-file

^ и $ гарантируют, что эти части привязаны к началу и концу строк соответственно.

Вы может также выполняться:

grep -x '>.*</li>' input-file

-x ищет точное соответствие: вся строка должна соответствовать шаблону (что подразумевает, что ^ и $ обернуты вокруг шаблона).

3
ответ дан 24 July 2018 в 19:08

Это входной файл:

$ cat /tmp/tmp.txt
>This is line 1.</li>
invalid line 1
>This is line 2.</li>
>This is line 3.</li>
invalid line 2

>This is line 4.</li>
last invalid line

Используя grep и awk, чтобы извлечь нужные строки:

$ cat /tmp/tmp.txt | grep -E '>*</li>' | awk -F\> '{ print $2 }' | awk -F\< '{ print $1 }'
This is line 1.
This is line 2.
This is line 3.
This is line 4.
0
ответ дан 22 May 2018 в 19:32
  • 1
    Нет необходимости использовать cat и grep, если вы используете awk: awk -F'[<>]' '/^>.*<\/li>$/{print $2}' tmp.txt; и нет необходимости использовать awk, если вы используете grep: grep -Po '^>\K.*(?=</li>$)' foo – muru 14 August 2017 в 04:20
  • 2
    «Простой лучше, чем сложный», @muru (см. python.org/dev/peps/pep-0020 ) – boardrider 15 August 2017 в 01:06
  • 3
    Я бы сказал, что одна команда awk проще, чем этот беспорядок конвейера. Perl выглядят немного, хотя, я вам это дам. – muru 15 August 2017 в 02:15

Это входной файл:

$ cat /tmp/tmp.txt >This is line 1.</li> invalid line 1 >This is line 2.</li> >This is line 3.</li> invalid line 2 >This is line 4.</li> last invalid line

Используя grep и awk, чтобы извлечь нужные строки:

$ cat /tmp/tmp.txt | grep -E '>*</li>' | awk -F\> '{ print $2 }' | awk -F\< '{ print $1 }' This is line 1. This is line 2. This is line 3. This is line 4.
0
ответ дан 18 July 2018 в 08:38

Это входной файл:

$ cat /tmp/tmp.txt >This is line 1.</li> invalid line 1 >This is line 2.</li> >This is line 3.</li> invalid line 2 >This is line 4.</li> last invalid line

Используя grep и awk, чтобы извлечь нужные строки:

$ cat /tmp/tmp.txt | grep -E '>*</li>' | awk -F\> '{ print $2 }' | awk -F\< '{ print $1 }' This is line 1. This is line 2. This is line 3. This is line 4.
0
ответ дан 24 July 2018 в 19:08
  • 1
    Нет необходимости использовать cat и grep, если вы используете awk: awk -F'[<>]' '/^>.*<\/li>$/{print $2}' tmp.txt; и нет необходимости использовать awk, если вы используете grep: grep -Po '^>\K.*(?=</li>$)' foo – muru 14 August 2017 в 04:20
  • 2
    «Простой лучше, чем сложный», @muru (см. python.org/dev/peps/pep-0020 ) – boardrider 15 August 2017 в 01:06
  • 3
    Я бы сказал, что одна команда awk проще, чем этот беспорядок конвейера. Perl выглядят немного, хотя, я вам это дам. – muru 15 August 2017 в 02:15

Другие вопросы по тегам:

Похожие вопросы: