LINUX.ORG.RU

Следующая после целевой строка

 ,


0

1

В общем есть текст типа:

Name1
Value1
Name2
Value2
Name3
Value3
...
Мне известны строковые значения Name1..NameN. Мне нужно получить значения Value, соответствующие Name. Я пробовал так:
  Profile_info=$( echo "$Profile_info" | sed -e 's/Галерея\n/Галерея /;s/Новости\n/Новости /;s/Голосования\n/Голосования /;s/Форум\n/Форум /')
Пробовал с echo -e.

Но фигу там, не сработало. То ли переносы какие-то другие, то ли так вообще нельзя. Как поступить? Некоторые NameM могут отсутствовать. В таком случае мне нужно либо значение пустой строки, либо «Name1 : x»

Тебя предупреждали что парсирнг хмла регэкспами это путь в никуда. Да и хоть сколько-нибудь сложное приложение на баше в общем-то тоже.

Попробуй избавиться от всех \s и дальше что-нибудь из этого треда.

Kalashnikov ★★★
()
Ответ на: комментарий от winlook38

Если действовать так, то показывает обе строки. Мне же нужно в одну строку - либо «Name1 : Value1» либо только «Value1».

AlexCones ★★★
() автор топика

Во первых grep -A1, а во вторых прочти уже наконец info sed:

echo -e 'Name01\nValue1\nName02\nValue2\nName03\nValue3' | sed '/Name0[23]/ {N; s/\n/ /}'
Name01
Value1
Name02 Value2
Name03 Value3

Видишь тут волшебную команду «N»? Она нужна потому что sed работает построчно. Считывая одну строку без символа перевода строки на конце. При считывании сразу двух строк в pattern space они уже разделаются символом перевода строки.

И кроме того, может всё таки прислушаешься к совету sdio и воспользуешься библиотеками для работы с html, вместо этих костылей на sed/grep/и т.п.?

kim-roader ★★
()
Ответ на: комментарий от AlexCones

Если действовать так, то показывает обе строки. Мне же нужно в одну строку - либо «Name1 : Value1» либо только «Value1».

$ echo -e 'Name01\nValue1\nName02\nValue2\nName03\nValue3' | grep 'Name0[12]' -A1 | grep -v 'Name0[12]'
Value1
Value2
$
$ echo -e 'Name01\nValue1\nName02\nValue2\nName03\nValue3' | awk '/Name0[13]/ {getline; print}'
Value1
Value3
$
kim-roader ★★
()
Ответ на: комментарий от Kalashnikov

Б-же, да где вы здесь парсинг xml увидели? Откройте исходник страницы профиля и возьмите с полки пряник, если найдете отличия между записью «Новости» и «Галерея» в таблице.

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

Не понимать.

      <tr>
        <td>Галерея</td>
        <td>1</td>
      </tr>
      
      <tr>
        <td>Форум</td>
        <td>6</td>
      </tr>
Любым дом парсером легко распарсилось бы циклом по tr. В первом td ключ, во втором значение. Перед этим все ключи можно проинициализировать нулём и всё вообще красиво получается.

Kalashnikov ★★★
()
Ответ на: комментарий от AlexCones

Откройте исходник страницы профиля

          <li><a href="/news/">Новости</a></li>
          <li><a href="/gallery/">Галерея</a></li>

          <li><a href="/forum/">Форум</a></li>
          <li><a href="/tracker/">Трекер</a></li>
          <li><a href="/wiki/">Wiki</a></li>

Вижу тут html. Собственно после фразы

исходник страницы

уже очевидно, что нужно парсить исходник в формате html подходящими для разбора html средствами, а не скриптами на sed.

kim-roader ★★
()
Ответ на: комментарий от Kalashnikov

В первом td ключ, во втором значение.

Еще раз перечтите ОП пост и посмотрите, какие строки я вынимаю.

Галерея
1
Форум
6

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

Еще раз перечтите ОП пост и посмотрите, какие строки я вынимаю

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

kim-roader ★★
()
Ответ на: комментарий от AlexCones

ССЗБ. Зачем вообще ты так пережевал данные?

Впрочем и так можно цикл по строкам организовать вместо возьни с регэкспами кстати. Даже баш должен это уметь.

Kalashnikov ★★★
()

Больная голова инструментам покоя не даёт.

aedeph_ ★★
()
Ответ на: комментарий от AlexCones

И тут мы снова возвращаемся к парсингу хмла регэкспами на баше.

У меня на яваскрипте кстати тоже 4 получилось не считая инициализации:

var stats = {"Галерея":0, "Форум":0, "Новости":0, "Голосования":0};
var rows = $('.message-table tr');
for (var i=rows.length; i-->0;) { 
    var cells = $(rows[i]).find('td');
    if (cells.length == 2)   // там в первом ряду thы
        stats[ cells.eq(0).text() ] = cells.eq(1).text()*1;
}
Kalashnikov ★★★
()

Кстати, раз уж ты упорно разбираешь HTML шелл-скриптами, то посмотри хотя бы утилиту html2 — обработка grep/sed/awk станет куда проще.

GotF ★★★★★
()

посмотри аwk в нём состояния и хэш для хранения пар.

тоже самое perl .

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

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Для конкретной задачи из поста sed подходит как микроязык для потоковой обработки текста. На нём вещи и похуже делают. Например info sed 'wc -c'

kim-roader ★★
()
Ответ на: комментарий от kim-roader

речь об этом же sed тьюринг полон однако на нём операционку не пракрично мутить

qulinxao ★★☆
()
Ответ на: комментарий от AlexCones

Откуда такая уверенность, что я разбираю html руками?

Ну дампишь текст который должен быть результатом отрисовки. Это ничуть не лучше. Тебе же, вместо этого, говорят, что работать надо сразу с деревом построенным тем питоновским модулем.

kim-roader ★★
()
Ответ на: комментарий от AlexCones

Даже если предположить что код lor'а меняться не будет, что вряд ли, всегда может измениться твоя дампилка. Вот например

$ w3m -dump http://www.linux.org.ru/people/AlexCones/profile 2>/dev/null | grep Раздел -A4
  Раздел    Число сообщений (тем)
Галерея     6
Голосования 2
Форум       275

показывает что дамп может выглядеть и по другому

kim-roader ★★
()
while read line; do
   if [ -z "$KEY" ]; then
       KEY="$line"
   else
       echo $KEY : $line;
       KEY=""
   fi
done
schizoid ★★★
()

ну во первых, самое простое - склеить все строчки попарно. типа sed 'N;s/\n/ /'

Однако, это ненадёжно. ИМХО самый прямой путь - склеивать нужную строчку при необходимости. Ну типа нужно распарсить <a href='http://xxx.com/'>xxx</a> (ага, назло всем я взял таки HTML), что-то вроде

/<a /{
 :l
 \%</a>% ! {
  N
  bl
  }
}
что-бы там не было накосоручено, строчка будет собрана до <a ...</a>, и её можно распарсить обычным способом.

ЗЫЖ нужно конечно проверить особый случай, когда <a есть, а </a> нет в принципе.

ЗЗЫЖ в «строчке» будут символы \n, но они не мешают. Обычный пробельный символ. Матчится [[:space:]] и \s.

drBatty ★★
()
Ответ на: комментарий от qulinxao

qulinxao

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

для такой тривиальной задачи выбирать анализатор непрактично. Помнится мне нужно было поставить на одном из чужих серверов VCS, для контроля файлов, и меня послали с моим mercurial'ом. Ибо питон, а тамошние одмины не любили питон. Они любили перловку. Дык я за час набросал sed-скрипт, который полностью реализовал нужный мне функционал. Уже третий год этот скрипт работает... Т.ч. смысл в велосипедах иногда таки есть.

drBatty ★★
()
Ответ на: комментарий от drBatty

ага.
тут мировозренческое
сундук со специализироваными (одна-функция) или «русский»(асиметричный) «топор»[китайская сапёрская лопата(утуб ими полон)] которые комбайны.

комбайн мобильней сундука однако мастер комбайна для многих задач слишком дорогой в найме.

qulinxao ★★☆
()
Ответ на: комментарий от drBatty

http://www.ioccc.org/years-spoiler.html#1984_anonymous
вполне полезный для развития понимания языка пример hello_word-программы
зы. современые компиляторы не проверяет семантику идентификатора на соответствие с выполняемыми с_ним|им действиями.
следовательно со временем(в ходе появления более продвинутых версий(sed и тп)) происходит увеличение зазора между семантикой имени и семантикой обьекта с этим именем.

qulinxao ★★☆
()

попробуй кстати ssam ( скрипт на основе sam ) по функции в томже отношении к sam как sed к ed

у sam в отличии от ed нет деления всего файла на строки при поиске регулярных выражений ( там конечно есть строковая адрессация,но не так всеобемлюща как в sed) в результате нужный тебе поиск пар стрэйтфорвард вполне.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

qulinxao

вполне полезный для развития понимания языка пример hello_word-программы

вы таки про какую именно программу? там много разных сцылок.

drBatty ★★
()
Ответ на: комментарий от drBatty

в сылке #anonymous в котором (1984) в стиле K&R однострочник hello-world(без цветовой подстветки можно и не заметить конструкии [«] ) - эдакий экскурс по тёмным(до сих пор законым) местам которые в tutoriаl'ах в хеловорды не пихают

qulinxao ★★☆
()
Ответ на: комментарий от drBatty

"одно"строк hw на a[i] == *(i+a) и "str"[i] == *("str\0"+i)

int i;main(){for(;i[«]<i;++i){--i;}»];read('-'-'-',i+++«hell\ o, world!\n»,'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

ну быдлокод как быдлокод... Что ту странного-то? Разве что в виде однострока непонятно. Но если развернуть:

int i; /* == 0 */

main()
{
	for(
			;
			i["]<i;++i){--i;}"]; /* тут может быть любая НЁХ нужной длинны */
			read(
				'-'-'-',
				i+++"hell\ o, world!\n",
				'/'/'/'
				)
			)
		;
}

read(j,i,p)
{
	write(
			j/p+p, /* fd => j == '-' - '-' == 0 */
			i---j, /* buf == (i++(global) + string) - 0 */
			i/i /* count == 1 */
			);
}
имхо всё очень просто, и понятно. Что тут непонятного-то?

drBatty ★★
()
Ответ на: комментарий от drBatty

тут всё понятно.
речь о «вечном» идентификаторы «ложные друзья переводчика программиста»

есть полная аналогия коментарий и идентификатор - и то и другое устаревает тем более если идентификатар виден снаружи.
компилятор ни коментарии не чекает на соответствие коментируемому , ни идентификаторы на смысловое соответствие .

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

компилятор ни коментарии не чекает на соответствие коментируемому , ни идентификаторы на смысловое соответствие .

дык в C/C++ имена переменных и не несут никакой смысловой нагрузки, и могут быть с лёгкость заменены например на v0, v1, v2,... Программа от этого работать будет не хуже. В данном быдлокоде это ещё и не всё: быдлокодер обыграл и другие грабли С, а именно отсутствие массивов. Ну нет в С массивов, есть только константные указатели. Ну и операция разименования такого указателя есть, называется a[ptr_diff], и на самом деле значит она всего лишь сложение указателя (не обязательно константного) с величиной типа ptr_diff, которая получается при вычитании указателей. Ну и конечно можно её и из int сделать. А массивов таки и нет, хотя с виду они есть. Потому-то многим кодерам и рвёт шаблон выражение i[«]<i;++i){--i;}»];

Но на самом деле, ничего неожиданного тут нет. Просто надо было K&R читать внимательно, и шаблон был-бы цел.

И да, пробел - самый лучший комментарий. Видно например по такому выражению:

y=x-----x;

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.