Текст извлечения с веб-сайта исходного кода

[

] Так как мне это снова понадобилось, я собрал Perl скрипт, который это делает; он оказался несколько сложным, поэтому я выпустил его здесь:[

] [

] [

] Что он делает, так это анализирует вывод из []-дерева [] - но, в отличие от примера OP, ему также нужна опция []--dirsfirst[]. Чтобы не забывать обо всем этом, сначала можно использовать []revrs-tree.pl[]:[

] [

perl revrs-tree.pl --getdir /usr/include/boost/accumulators/ > test.tree

] [

]... который просто вызовет дерево []-dirsfirst[] с правильными опциями, которые выводят в stdout - мы перехватываем это в файле []-теста. tree[].[

] [

] Затем, мы вызываем тот же самый скрипт на этом [] test.tree[] содержимом; но хитрость в том, что вывод не сами каталоги/файлы - а строки в скрипте [] bash[], вместо этого, распечатанные в stdout. Вызов выглядит так:[

] [

perl revrs-tree.pl --zerofill test.tree > test-tree.sh
# alternatively, can receive tree text from stdin:
cat test.tree | perl revrs-tree.pl --zerofill > test-tree.sh

] [

]... и []test-tree.sh[] затем содержит такие вещи как:[

] [

RTD="/usr/include/boost/accumulators";
read -p "WARNING! will output in '$RTD' directory!
Press [Enter] key to start output...";
if [ ! -d "$RTD" ] ; then mkdir "$RTD" ; fi ;

TDIR="$RTD/framework";
mkdir "$TDIR"; sudo chown root:root "$TDIR"; sudo chmod 755 "$TDIR"; sudo touch -d 'Jul 16 2014 9:43:00' "$TDIR";

TDIR="$RTD/framework/accumulators";
mkdir "$TDIR"; sudo chown root:root "$TDIR"; sudo chmod 755 "$TDIR"; sudo touch -d 'Jul 16 2014 9:43:00' "$TDIR";

TFIL="$RTD/framework/accumulators/droppable_accumulator.hpp";
cat /dev/zero | head --bytes 9740 >  "$TFIL";
touch -d 'Oct 21 2010 0:00:00' "$TFIL"; sudo chown root:root "$TFIL"; sudo chmod 644 "$TFIL";
...

] [

]Хитрость в том, что:[

] [

    ] [
  • ]Не забудьте изменить []RTD[] перед запуском скрипта - я этого ни разу не делал, и мне удалось перезаписать []/usr/include/boost/accumulators[] файлами с нулевым наполнением! (для чего потребовалось []sudo apt-get удалить --purge libboost1.42-dev && sudo apt-get установить libboost1.42-dev[] для меня) !!!! (поэтому при запуске скрипт будет ждать пользовательского ввода) ... Допустим, здесь вы изменили его на []/tmp/newtarget[].[
  • ] [
  • ][]tree[] не дает полных временных меток - так что времена обычно устанавливаются в 0[
  • ] [
  • ][]tree[], а также усекает uids/gids до каких-то 7 или 8 символов - так что, если у вас больше, чем у них, посмотрите на []. sh[], и при необходимости замените его.[
  • ] [

] [

] Затем, так как случилось, что примером OP был каталог, принадлежащий [] root[], []. sh[] скрипт содержит []sudo[] в соответствующих местах, так что вы можете также называть его как суперпользователь: [

] [

sudo bash test-tree.sh

] [

] После множества распечаток [] set -x[], скрипт должен закончиться; затем вы можете проверить, правильно ли реконструирована структура дерева каталогов/файлов, скажем, []diff[] - или []meld[]:[

] [

meld <(tree -spugD /tmp/newtarget/) <(tree -spugD /usr/include/boost/accumulators/)

] [

] Это не дает мне никакой разницы в выводе [] tree[] (для данного примера), кроме корневого каталога. [

]

1
13.04.2017, 15:37
1 ответ

В общем, следует использовать инструмент, который понимает html. Однако для ограниченных целей может быть достаточно простой команды. В этом случае sed достаточно, чтобы делать то, что вы просите, и он хорошо работает в сценариях bash . Если вы захватили исходный HTML-код в index.html , то:

$ sed -n 's/.*<p><p tabindex="0">\([^<]*\).*/\1/p' index.html 
Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.

Или, чтобы захватить HTML-код и обработать его за один шаг:

$ wget -q https://apps.ubuntu.com/cat/applications/clementine/ -O - | sed -n 's/.*<p><p tabindex="0">\([^<]*\).*/\1/p' 
Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.

Чтобы записать этот вывод в bash переменная:

output="$(wget -q https://apps.ubuntu.com/cat/applications/clementine/ -O - | sed -n 's/.*<p><p tabindex="0">\([^<]*\).*/\1/p')"

Параметр -n используется в sed . Это говорит ему не печатать вывод, если мы явно не попросим. sed просматривает строку за строкой в ​​поисках строки, соответствующей . *

\ ([^ <] * \). * . Весь текст, следующий за

, и следующий тег фиксируется в переменной 1. Все в этой строке затем заменяется только этим захваченным текстом, который затем печатается.

2
27.01.2020, 23:38

Теги

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