awk -F, '{if ($1 == "Blank") ip=repltext; else {ip=$1; repltext=$1;};
print ip "," $2}' inputfile
предполагая, что "Исходный IP, URL" не является частью входа. Если это - изменение в
awk -F, 'NR == 1 {next;}; {if ($1 == "Blank") ...
Также предполагая, что первая строка данных не содержит "Пробел", но всегда IP-адрес.
Лучшей стратегией будет использование правильного html парсера, который может выплюнуть значение всех тегов.
Здесь xmlstarlet
является именно парсером XML, и ваш HTML может быть не очень хорошо сформированным XML, но вы можете получить идею:
echo '<html>
<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>
</html>' | xmlstarlet sel -t -v //a
Image name.jpg
Ваше регулярное выражение равно
target="_blank">([[:graph:]]*)\.(jpg|png|gif|webm)
Это соответствует буквальному тексту target="_blank">
, за которым следует любое количество небелого пробела, с одной из четырех строк .jpg
, .png
, .gif
или .webm
в конце. Например, команда grep выводит жирные части следующих строк:
<a … target="_blank">something.jpg</a> <a … target="_blank">a.gifted.child.txt</a> <a … target="_blank">something else.jpg</a> <a … target="_blank">something.jpg</a>+more.jpg
И если вы используете [[:print:]]
вместо [[:graph:]]
, то это будет соответствовать чему-то вроде
<a … target="_blank">something.jpg</a> wibble wobble <a … target="_blank">something else.jpg</a>
Все между первым совпадающим целевым битом ...
и последним совпадающим расширением на строке является совпадением.
Все, что вам нужно, это исключить HTML-символы разметки из совпадения.
target="_blank">[^<>]*\.(jpg|png|gif|webm)</a>
С помощью GNU grep вы можете использовать опцию -P
для получения конструкций из Perl регулярных выражений , и в частности утверждения нулевой ширины , которые позволяют указать, что чему-то предшествует или за чем следует некоторый константный текст без включения этого текста в совпадающую часть.
grep -o -P '(?<target="_blank">)[^<>]*\.(jpg|png|gif|webm)(?=</a>)'
Это все равно может не сработать, если появится неожиданный пробел (например, новая строка между тегом и закрывающим
, или ). Вы бы лучше использовали правильный парсер HTML.
Например, на питонском языке с помощью BeautifulSoup (непроверенный):
import re, sys, BeautifulSoup
soup = BeautifulSoup(sys.stdin)
for hit in soup.find_all('a', target='_blank'):
if re.match(r'.*\.(jpg|png|gif|webm)\Z', hit.string):
print(hit.string)
Аналогичный код можно написать с помощью HTML::Parser
на Perl, Nokogiri на Ruby и др.
Я закончил так:
w3m -dump -T text/html "$thread" | grep -i -E -o 'File\:+([[:print:]]*)\.(jpg|png|webm|gif)'
w3m очищает код, а затем я могу смазать имена файлов. (Мне нужна буквальная часть "File:", чтобы отличить связанный файл от его названия). Мне действительно нужен [[:print:]], потому что он ловит большинство пробельных символов, символов юникода и других печатных таблиц.
, которая работает, как я и предполагал (хотя я все еще должен придумать, как предотвратить перезапись файлов с тем же именем, но это битва на другой день)
.