LINUX.ORG.RU

sed удаление всего, что не соответствует маске

 


0

1

Доброго дня господа
Толи жара, то ли я глуплю, то ли и то и другое.
Не могу решить тривиальную задачку, что бы по красоте.
Необходимо узнать полные пути к файлам, в указанной папке, для получения итогового списка в виде выхлопа.
Список получаю просто find'ом, и хочу удалить из списка всё - что не имеет файла, что удовлетворяет маску (к примеру в списке хочу видеть только пути к *.jpg).
В итоге не могу заставить сэд это сделать, а еще один пайп с грепом - не доставляет эстетического удовольствия.
Если кому не сложно - был бы признателен за подсказку.
Заранее благодарен.

★★★

Последнее исправление: Spirit_of_Stallman (всего исправлений: 1)

Ответ на: комментарий от Drolyk

Вы вогнали меня в ступор, от того, насколько я затупил.
Мерси.

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

sed '/[^jpg]/d'

Это удалит строки, которые содержат символы, кроме j, p и g, и оставит строки, полностью состоящие из символов j, p и g.

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

sed '/[^jpg]/d'

Это удалит строки, которые содержат символы, кроме j, p и g, и оставит строки, полностью состоящие из символов j, p и g.

это относится только к первому найденному символу. Грубо говоря, sed ищет символ, любой, кроме j, p, g, и найдя его удаляет всё.

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

а как тогда быть, в случае сэда, что бы он таки сделал, что хотелось бы (мне)?

http://drbatty.ru/sed/index.html

долго рассказывать... но я записал.

drBatty ★★
()
Ответ на: комментарий от aedeph_
> grep -EHnr "echo" /etc/init.d|grep '\\'
/etc/init.d/kbd:68:    if [ -n "$UNICODE_MODE" -a -z "`eval echo \\$CONSOLE_MAP_vc$vc`" ]; then
/etc/init.d/postfix:159:        echo -e /dev/random\\n/dev/urandom | cpio -pdL --quiet . 2>/dev/null || true
/etc/init.d/xdm:66:      echo "Not starting X display manager (xdm); it is not the default" \
GotF ★★★★★
()

в указанной папке, для получения итогового списка в виде выхлопа.

Список получаю просто find'ом, и хочу удалить из списка всё - что не имеет файла, что удовлетворяет маску (к примеру в списке хочу видеть только пути к *.jpg).

ищи jpg, а потом отрезай имена файлов. найдёшь пути.

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

В BRE и ERE ведь нельзя исключить последовательность символов?

нет.

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

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

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

Это удалит строки, которые содержат символы, кроме j, p и g, и оставит строки, полностью состоящие из символов j, p и g.

это относится только к первому найденному символу. Грубо говоря, sed ищет символ, любой, кроме j, p, g, и найдя его удаляет всё.

Это одно и то же, разве нет? Понятно, что искать будет до первого символа, потому что регулярка удовлетворяет одному символу.

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

ищи jpg, а потом отрезай имена файлов. найдёшь пути.

Зачем отрезать? Сразу пути выводи
find . -type f -name '*.jpg' -printf «%h\n»

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

Ну я догадался, что тебе не нравится эта строка. А что конкретно с ней не так? На всякий случай уточню, что выполняется она не в bash.

GotF ★★★★★
()
Ответ на: комментарий от aedeph_
> head -n1 /etc/init.d/postfix
#!/bin/sh -e

Специально для анабиозников сообщаю, что последние башизмы из инит-скриптов в Debian выпилили довольно давно. А именно с тех пор, как /bin/sh стал указывать на /bin/dash.

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

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

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