Выражение строк из файла и запуск команды - PullRequest
0 голосов
/ 01 августа 2011

У меня есть файл с выводом команды идентификации, выглядит следующим образом (следующий формат: ФОРМАТ ФИЛЬМЕНА РАЗМЕР МЕТАДАННЫХ )

/foo/bar.jpg JPEG 2055x1381 2055x1381+0+0 8-bit DirectClass 
/foo/ham spam.jpg JPEG 855x781 855x781+0+0 8-bit DirectClass
...

Обратите внимание, что имена файлов могут содержать пробелы! То, что я хочу сделать, это в основном запустить это на каждой из этих строк:

convert -size <SIZE> -colors 1 xc:black <FILENAME>

Другими словами, создание пустых изображений существующих. Я пытался сделать это с помощью cat / sed / xargs, но это заставляет мою голову взорваться. Есть намеки? И желательно решение командной строки ..

Ответы [ 3 ]

1 голос
/ 01 августа 2011
cat data_file | sed -e 's/\(.*\) JPEG \([^ ]*\) .*/convert -size \2 -colors 1 xc:black "\1"/' | bash
1 голос
/ 01 августа 2011

При условии, что имя файла является строкой перед "JPEG":

LINE="/foo/ham spam.jpg JPEG 855x781 855x781+0+0 8-bit DirectClass"

Вы можете получить имя файла как:

FILENAME=$(echo "$LINE" | sed 's/\(.*\) JPEG.*/\1/')
0 голосов
/ 01 августа 2011

Вы можете делать то, что предлагает Михал. Кроме того, если метаданные имеют фиксированное количество слов, вы можете легко сделать это, как показано ниже (предположим, вы обрабатываете каждую строку):

FILENAME=`echo $LINE | rev | cut -d\  -f 6- | rev`

(то есть, переверните строку и возьмите имя из шестого параметра, затем вы должны повернуть вспять, чтобы получить правильное имя файла.)

Если нет, вы можете использовать тот факт, что все изображения имеют расширение, а само расширение не имеет пробелов, а затем искать расширение до первого пробела:

FILENAME=`echo $LINE | sed -e '/([^.]+) .*$/\1/'`
...