来自文件和运行命令的正则表达式行

时间:2011-08-01 10:43:41

标签: bash command-line sed xargs

我有一个带有identify命令输出的文件,看起来像这样(格式如下: FILENAME FORMAT SIZE METADATA

/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 个答案:

答案 0 :(得分:1)

假设该文件名是“JPEG”之前的字符串:

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

您可以将文件名称设为:

FILENAME=$(echo "$LINE" | sed 's/\(.*\) JPEG.*/\1/')

答案 1 :(得分:1)

cat data_file | sed -e 's/\(.*\) JPEG \([^ ]*\) .*/convert -size \2 -colors 1 xc:black "\1"/' | bash

答案 2 :(得分:0)

你可以做Michał建议的事情。此外,如果元数据具有固定数量的单词,您可以像下面这样轻松地执行此操作(假设您处理每一行):

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

(也就是说,反转该行,并从第六个参数中取名,然后你必须反转以获得正确的文件名。)

如果没有,你可以使用这样的事实:所有图像都有一个扩展名,扩展名本身没有空格,然后搜索扩展名直到第一个空格:

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