Bash Grep между двумя строками в html-файле

На самом деле то, что вы описываете, сработает, с некоторыми замечаниями:

  1. Вы можете просто поместить docker container lsв файл с именем /bin/dcls. Но поведение этого может быть немного сложным. Немного надежнее начинать файл со строки под названием «шебанг», поэтому файл будет выглядеть как
    #!/bin/sh
    docker container ls
    , что указывает на то, что файл является сценарием оболочки.
  2. Прежде чем вы сможете запустить команду, вы должны сделать исполняемый файл с помощью команды вроде
    chmod +x /bin/dcls
    Вам, вероятно, нужно быть root, чтобы сделать это (, то есть запустить его с помощьюsudo).
  3. Выполните два вышеуказанных шага, и вы сможете ввести dclsтак и будет docker container ls. Но если вы наберете dcls -l foo, это все равно будет docker container ls. Если вы хотите, чтобы это было сделано docker container ls -l foo, вы должны изменить сценарий, чтобы сказать

    #!/bin/sh
    docker container ls "$@"
    который указывает, что любые аргументы, которые вы вводите в командной строке dcls, следует передать команде docker container ls.

    Естественно, есть вещи и посложнее вы можете сделать с аргументами строки команды -.

Для преобразования одна простая команда → одна простая команда, которым не нужно делиться с другими пользователями, проще определить псевдоним (, как предложил Фредди ), или функцию оболочки. Более сложные функции часто записываются в виде скриптов; т. е. текстовые файлы, содержащие команды. Но, если вам не нужно делиться им с другими пользователями, чаще используется частный каталог bin.

$ cd                                    # (to your home directory)
$ mkdir bin

Затем скопируйте dclsв $HOME/bin, и добавьте

export PATH="$HOME/bin:$PATH"

к вашему ~/.bashrc.

Также принято помещать личные скрипты в /usr/local/bin, и оставьте /binдля программ, идущих в комплекте с системой.

1
25.01.2021, 19:32
4 ответа

Использование lynxдля преобразования HTML в текст, затем sedудаление всего до пробела после >в каждой строке (, но вывод только тех строк, которые действительно были затронуты ).

$ lynx --dump 'http://homeoint.org/books/boericmm/d.htm' | sed -n 's/.*> //p'
DAMIANA (TURNERA)
DAPHNE INDICA
DIGITALIS PURPUREA (DIGITALIS)
DIOSCOREA VILLOSA
DIOSMA LINCARIS
DIPHTHERINUM
DOLICHOS PRURIENS (DOLICHOS PURIENS - MUCUNA)
DORYPHORA DECEMLINEATA (DORYPHORA)
DROSERA ROTUNDIFOLIA (DROSERA)
DUBOISIA MYOPOROIDES (DUBOISIA)
DULCAMARA

Если у вас возникли проблемы с lynxвставкой разрывов строк -, увеличьте ширину «страницы» с 80 по умолчанию до большего числа с помощью--width(см. lynxруководство ).

2
18.03.2021, 22:34

Используйте trдля удаления разрывов строк(tr -d $'\n')и сокращения повторов <space>(tr -s ' '), после чего вы можете легкоgrep:

curl 'http://www.homeoint.org/books/boericmm/d.htm' \
| tr -d $'\n' \
| tr -s ' ' \
|  grep -Po '&gt; *\K[^<]*'

Выход:

DAMIANA (TURNERA)
DAPHNE INDICA
DIGITALIS PURPUREA (DIGITALIS)
DIOSCOREA VILLOSA
DIOSMA LINCARIS
DIPHTHERINUM
DOLICHOS PRURIENS (DOLICHOS PURIENS - MUCUNA)
DORYPHORA DECEMLINEATA (DORYPHORA)
DROSERA ROTUNDIFOLIA (DROSERA)
DUBOISIA MYOPOROIDES (DUBOISIA)
DULCAMARA

(ваш grepтоже подойдет, но ваш .* жадный, вам нужен.*?).

1
18.03.2021, 22:34

Вы можете использовать python+ BeautifulSoupдля анализа веб-сайта.

Это не очень красиво, так как код этого веб-сайта htmlявляется наихудшим методом, но он работает.


Поместите это в файлscript.py:

#!/usr/bin/env python3
import requests
from bs4 import BeautifulSoup
import re

def parse(url):
    html = requests.get(url).text
    soup = BeautifulSoup(html, 'html.parser')
    items=(re.findall('(?<=&gt; )[^<]*', " ".join(str(soup.find_all("p")[4]).split())))
    for i in items:
        print (i)

parse('http://homeoint.org/books/boericmm/d.htm')

Чтобы получить все страницы (что, я думаю, вы хотите сделать... ), замените последнюю строку на:

import string
for c in list(string.ascii_lowercase):
    parse('http://homeoint.org/books/boericmm/'+c+'.htm')

И запустите python script.pyилиpython3 script.py

Конечно, вам необходимо установить зависимости (bs4, re,requests).

0
18.03.2021, 22:34

С GNU awk для мульти -char RS:

awk -v RS='&gt;|<br>' '!(NR%2){$1=$1; print}' file
DAMIANA (TURNERA)
DAPHNE INDICA
DIGITALIS PURPUREA (DIGITALIS)
DIOSCOREA VILLOSA
DIOSMA LINCARIS
DIPHTHERINUM
DOLICHOS PRURIENS (DOLICHOS PURIENS - MUCUNA)
DORYPHORA DECEMLINEATA (DORYPHORA)
DROSERA ROTUNDIFOLIA (DROSERA)
DUBOISIA MYOPOROIDES (DUBOISIA)
DULCAMARA
2
18.03.2021, 22:34

Теги

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