LINUX.ORG.RU

sed на практике


0

1

Имеется строка вида:

wget -qO- "http://-" | egrep "x|y" | sed "s/*x*/*xxxXXXxxx*/g;s/*y*/*YYyyYYyyYY*/g" > $file

Абсолютно всегда «y» попдает на вход sed ранее чем «x» (после появления «x» «y»-ки больше не встречается), так же «x» всегда встречается в тексте только один раз (в конце документа). Собственно, вот что нужно: поместить «xxxXXXxxx» в начало $file, а не в конец, куда эта строка попадает.

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

★★

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

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

Это очень плохо. Тогда получается надо писать файл wget`ом, потом дважды делать «cat|grep»? Не очень радужная перспектива(

Кроме sed можно использовать что-то ещё? Аналогичное.

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

Если я правильно понял, то...
sed '1!G;h;$!d;s/*x*/*xxxXXXxxx*/g;s/*y*/*YYyyYYyyYY*/g'
В вашем варианте тупо можно через $tac страницу перевернуть=)

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

Вах! Вот это номер! А можно после первого вхождения «х» ещё разок перевернуть текст?

То есть взять оригинал, перевернуть, получив первую нужную строку (с «х») перевернуть поток ещё раз и искать дальше всякие «y» не заморачиваясь на «х», так как он уже получен.

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

Раз 5 перечитал, теперь не понял совсем.
Как в шапке сабжа задачу можно оформить?Или попонятней сформулировать что нужно

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

Что есть и что надо.

Качаю страничку из которой нужны два типа данных «x» и «y» (их я вытаскиваю при помощи grep). На странице данные расположены следующим образом:

...
x(1..n})
...
y
...
Мне нужно получить на выходе строки вида:
...|y|...|x(1)|...
...|y|...|x(2)|...
...
...|y|...|x(n)|...
Разумеется что самый простой выход это скачать страницу и выбрать «y», за тем скачать страницу второй раз, выбирая все «x» и записывая результат юзать ранее созданную переменную, содержащую «y». Однако этот способ увеличивает расход трафика и затрачиваемое время ровно в два раза.

Другой вариант - скачать и сохранить в промежуточный файл, потом его парсить, но страниц для обработки слишком много и число перезаписай будет колосальным, что губит ssd сокращая срок его жизни.

Теперь вопрос: есть-ли способ получить результат за одно скачивание без промежуточных файлов?

В принципе, решение уже есть (Ваш предыдущий совет с переворачиванием документа), но он даёт на выходе не совсем идеальный результат - строки в обратном порядке:

...|y|...|x(n)|...
...|y|...|x(n-1)|...
...|y|...|x(n-2)|...
...
...|y|...|x(1)|...
Вот я и думаю, как от этого избавиться.

zzdnx ★★
() автор топика
Ответ на: комментарий от val-amart

С авком я как раз полный ноль. Оригинальный текст страницы выглядит так:

...
тегг <a> со ссылкой (которая со всеми передаваемыми параметрами и есть мой "x")
...
тегг <a> со ссылкой №2 (может и не быть, равно как и следующих за ним, если на странице только одна такая ссылка)
...
тегг <a> со ссылкой №n
...
тегг содержащий дату (которая и есть мой "y").
...
мне нужно получить строки вида:
...|y|...|x(1)|...
...|y|...|x(2)|...
...
...|y|...|x(n)|...

zzdnx ★★
() автор топика
Ответ на: комментарий от zzdnx
awk '/<a>/ {i++; x[i]=$0} /date/ {y=$0} END {for (j=1; j<=i; j++) printf("%s %s\n", y, x[j])}'

вместо /xxxxx/ подставь регулярки для матча нужных строк, $0 содержит всю строку, тебе надо только ее часть, но так как ты мне строку так и не показал, вырезать ее тебе я не смогу.

// не тестировал.

val-amart ★★★★★
()
Ответ на: комментарий от val-amart
wget -U "$UserAgent" -qO- "$BaseURL/?$c&code=view&idx=$i" | egrep "날짜|mods/misc/getfile.php"
<div style="*"><div class="*"><img src="./mods/misc/getfile.php?name=IMG_9520s.jpg&wcu=201012270217433773340&modnum=1170378287" id="*" style="*"/></div><div class="*"></div>①<br /></div>
<div style="*"><div class="*"><img src="./mods/misc/getfile.php?name=IMG_9394s.jpg&wcu=201012270217433773340&modnum=1170378287" id="*" style="*"/></div><div class="*"></div>②<br /></div>
*<br />*<br />*<br />날짜 : 2005-12-19 22:03:35<br />*<br /><br />*.<br />

Получить нужно:

$ID|...|2005-12-19_22-03-35|$BaseURL/mods/misc/getfile.php?name=IMG_9520s.jpg&wcu=201012270217433773340&modnum=1170378287|...
$ID|...|2005-12-19_22-03-35|$BaseURL/mods/misc/getfile.php?name=IMG_9394s.jpg&wcu=201012270217433773340&modnum=1170378287|...
P.S. закидал звёздочками много лишних букв

zzdnx ★★
() автор топика
Последнее исправление: zzdnx (всего исправлений: 1)
Ответ на: комментарий от val-amart

Огромное спасибо! Заработало как надо! Но немного пришлось подредактировать и добавить несколько фильтров, так как результат работы awk оказался довольно обильным... Монстр в итоге вышел на вид не приглядный, но за то работающий на все 100%.

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