У меня есть большой файл HTML на моем рабочем столе, который похож
src="http://images.alaablubnan.com/images/Balls/20.jpg"
alt="http://images.alaablubnan.com/images/Balls/20.jpg"/></a></td><td><a
href="http://images.alaablubnan.com/images/Balls/32.jpg"
target="_blank"><img
src="http://images.alaablubnan.com/images/Balls/32.jpg"
alt="http://images.alaablubnan.com/images/Balls/32.jpg"/></a></td><td><a
href="http://images.alaablubnan.com/images/Balls/30.jpg"
target="_blank"><img
src="http://images.alaablubnan.com/images/Balls/30.jpg"
alt="http://images.alaablubnan.com/images/Balls/30.jpg"/></a></td></tr><tr><td><table><tr><td>webpage/url</td><td>http://www.playlebanon.com/webservices/website/lotto/PopUps/HistoryDetail.aspx?t=1405536730503&FromDraw=1&ToDraw=1213&Draw=0</td></tr></table></td><td>2</td><td>complete
lotto results</td><td>complete lotto results</td><td>2</td><td><a
href="http://www.playlebanon.com/webservices/website/lotto/PopUps/HistoryDetail.
Если возможно, я хочу:
Это не на самом деле особенно хорошее задание для sed
но здесь идет:
sed -nr 's#.*/([^"]+).jpg.*#\1#p' file
Вышеупомянутое получит Вас список чисел, один на строку:
20
20
32
32
32
30
30
30
Теперь, на самом деле возможно получить все они на той же строке с 7 числами на строку с помощью sed
но это действительно не стоит усилия. Просто используйте стандарт *, отклоняют инструменты вместо этого:
$ echo $(sed -nr 's#.*/([^"]+).jpg.*#\1#p' file | tr $'\n' ' ') | fold -sw 21
20 20 32 32 32 30 30
30
Или, если Вы хотите удалить дубликаты:
echo $(sed -nr 's#.*/([^"]+).jpg.*#\1#p' file | sort -u | tr $'\n' ' ')
20 30 32
sed
команда использует несколько приемов:
-n
: не печатайте строки по умолчанию.-r
: включите расширенные регулярные выражения, это позволяет нам использовать ( )
получать группы, не будучи должен выйти из круглых скобок и +
для "одного или нескольких".s#from#to#
: в то время как стандартный оператор замены в sed
и другой, подобные инструменты, s/from/to/
, Вы можете нестандартный разделитель так, чтобы можно было включать /
в шаблоне. В этом случае я использую #
но Вы могли использовать что-то еще как s|from|to|
также.s#.*/([^"]+).jpg.*#\1#p
: это будет соответствовать всему с начала строки до a /
и затем получает самый длинный фрагмент не -"
символы до .jpg
. Это - имя файла минус расширение. Имя файла получено в круглой скобке и целой строке (из-за .*
с обеих сторон), будет заменен полученной скороговоркой (\1
). p
в средствах конца, что это распечатает строки, где замена была успешна. Лично, хотя, я сделал бы все это с perl
во-первых:
$ perl -e '@k=grep(s/.*\/([^"]+).jpg.*/$1/s,<>); print "@k[0..6]\n@k[7..$#k]\n"' file
20 20 32 32 32 30 30
30
Или, для большего файла:
$ perl -e '@k=grep(s/.*\/([^"]+).jpg.*/$1/s,<>); for($i=0;$i<=$#k;$i+=7){print "@k[$i..$i+7]\n"}' file
20 20 32 32 32 30 30 30
30
Или grep
даже:
$ echo $(grep -oP '[^/]+(?=.jpg)' file | tr $'\n' ' ' ) | fold -w 21
20 20 32 32 32 30 30
30
Или, кража умного @Olli xargs
идея:
$ grep -oP '[^/]+(?=.jpg)' file | xargs -n7 echo
20 20 32 32 32 30 30
30
Я предполагаю, что Вы пытаетесь очистить своего рода результат. В этом примере существует только три шара, и мы можем извлечь их путем поиска Balls/<one-or-many-digits>
и группировка ( \(..\)
создайте) вокруг числа и затем замены всех с той группой ( \1
ссылка на первую группу).
$ sed -n 's/.*Balls\/\([0-9]\+\).*/\1/gp' htmlfile | uniq | xargs -n7 echo
20 32 30
sed
проходит это линию за линией. Я прошу, чтобы это соответствовало и заменило все на строке (который является, почему мы ограничиваем каждый конец с .*
— "любая сумма чего-либо") с тем, чему это соответствует в группе. -n
и /p
используются вместе для не печати, если строка не была соответствием и /g
средства, которым это будет продолжать соответствовать, пока это не поразит конец файла.
Это - довольно сложный пример, если Вы плохо знакомы с регулярными выражениями.
Я передаю его через uniq
потому что существует много дублирования, продолжающегося там.
И я использую | xargs -n7 echo
на конце аргументам группы 7 вместе и передают их всех на echo
. Нет 7 шаров здесь, таким образом, это только показывает 3.
Это, вероятно, замедляет его, но у Вас может быть немного больше читаемого выражения, если Вы используете -r
расширенный синтаксис для sed
:
sed -nr 's/.*Balls\/([0-9]+).*/\1/gp' htmlfile | ...
Делает то же самое, только без части запутывающего выхода взгляда.
Вероятно, очень немного медленнее.