Удалите текст, который я не хочу

У меня есть большой файл 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.

Если возможно, я хочу:

  • получите все .jpg файлы, удалите весь HTML-код (это 1.jpg, 2.jpg... к 42.jpg),
  • Я хочу удалить .jpg extenstion
  • Я хочу, чтобы каждая строка чисел имела 7 чисел только, затем вставила новую строку
5
задан 30 July 2014 в 08:56

2 ответа

Это не на самом деле особенно хорошее задание для 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
11
ответ дан 23 November 2019 в 08:39

Я предполагаю, что Вы пытаетесь очистить своего рода результат. В этом примере существует только три шара, и мы можем извлечь их путем поиска 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 | ...

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

8
ответ дан 23 November 2019 в 08:39

Другие вопросы по тегам:

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