LINUX.ORG.RU
решено ФорумAdmin

Поиск,парсинг,grep.

 ,


0

2

Есть котолог в котором много файлов (страниц вики) из них надо выцыпить все имена вставленных вложений (jpg,doc,png и так далее). Далее запихнуть в массив и бла,бла... т.к. В «страницах вики» вложения заключены в скобки {{ image.jpg }}. Очень хочу найти команду с помощью которой можно вывести текст который заключен в скобки '{{ * }}'. Пока этого мне не удалось.

grep -ri {{:* ./* | sed 's/:/  /g' | sed 's/.txt/  /g' | sed 's/?nolink/ /g' | sed 's/?/ /g' | sed 's/direct&/ /g' | sed 's/linkonly/ /g' | sed 's/direct/ /g' | sed 's/\\/ /g' | sed 's/|/ /g' | sed 's/mufs/ /g' | sed 's/{{/ /g'  | sed 's/}}/ /g'  | sed 's/[//]/ /g'  | tr -s '[:space:]' '\n'
пока извращаюсь так, но этот вариант не подходит...

grep -o '{{ [a-zA-Z0-9.]* }}'

В скобках можешь уточнить по своим данным, но просто .* для BRE/ERE там не подходит из-за жадности.

anonymous
()

grep -P -o '{{.*?}}'.

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

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

Задача простая, мне нужны только имена вложений. что бы запихнуть их в переменную. а я получаю :

./using_icinga.txt:{{:mufs:image1.jpg?600|}}
./using_icinga.txt:{{:mufs:image2.jpg?900|}}
./using_icinga.txt:{{:mufs:image3.jpg?900|}}
./using_icinga.txt:{{:mufs:image4.jpg?900|}}
./using_icinga.txt:{{:mufs:image5.jpg?600|}}
./using_icinga.txt:{{:mufs:image7.jpg?600|}}
./using_icinga.txt:{{:mufs:image6.jpg?600|}}
./site-ep.txt:Данное окно открывается автоматически при запуске HP Open View и позволяет масштабировать карту сегмента путем выделения курсором мыши некоторой области. Чем меньше область, тем крупнее будут иконки NE. Также окно масштабирования можно открыть нажав на кнопку "Pan & Zoom" {{:mufs:464564.png?nolink|}}
./site-ep.txt:{{:mufs:7984787.png?nolink|}}
whitedevil
() автор топика
Ответ на: комментарий от legolegs

Спасибо кстати, твой вариант немного преобразовал, дальше лишнее уже буду убирать sed'ом.

grep  -owshP  '{{.*?}}' ./* 

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

Не обязательно делать миллион седов:

# echo '{{:mufs:image1.jpg?600|}} {{:mufs:464564.png?nolink|}}' | sed -r 's/(:mufs:|\?[[:digit:]]+|\?nolink)//g;s/\|\}\}/}}/g'
{{image1.jpg}} {{464564.png}}
legolegs ★★★★★
()
echo '{{:mufs:image1.jpg?600|}} {{:mufs:464564.png?nolink|}}' | tr -s " " "\012" |  perl -ne '$_ =~ /([a-z0-9]+\.[a-z]{3,4})/; print "$1\n"'

image1.jpg
464564.png
anonymous
()

Консоль головного мозга. Осиль уже петон.

anonymous
()

В тегах у вас нет sed-а. Так что и на bash-е тоже можно. И без grep/sed:

l='aaa{{:mufs:464564.png?nolink}}bbb'

[[ "$l" =~ \{\{(:[^:]*:)*([^?}]+)[^}]*\}\} ]] && echo "${BASH_REMATCH[2]}"

464564.png

Причём, этот regex сработает и при отсутствии ":mufs:" и/или "?nolink..."

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

Спасибо за варианты «парсинга». Даже учитывая что задача уже выполнена, гуру всё равно стараются просветить чайников.

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