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

发布于 2024-11-27 04:49:06 字数 416 浏览 1 评论 0原文

我有一个包含识别命令输出的文件,如下所示(以下格式:文件名格式大小元数据

/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 来做到这一点,但这让我的头爆炸。有什么提示吗?最好是命令行解决方案..

I have a file with output from the identify command, looks like this (following format: 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
...

Note that the filenames can contain spaces! What I want to do is to basically run this on each of those lines:

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

In other words, creating blank images of existing ones. I've tried doing this with cat/sed/xargs but it's making my head explode. Any hints? And preferably a command-line solution..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

何时共饮酒 2024-12-04 04:49:06

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

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

您可以将文件名获取为:

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

Assuming, that filename is the string before " JPEG":

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

You can get file name as:

FILENAME=$(echo "$LINE" | sed 's/\(.*\) JPEG.*/\1/')
套路撩心 2024-12-04 04:49:06
cat data_file | sed -e 's/\(.*\) JPEG \([^ ]*\) .*/convert -size \2 -colors 1 xc:black "\1"/' | bash
cat data_file | sed -e 's/\(.*\) JPEG \([^ ]*\) .*/convert -size \2 -colors 1 xc:black "\1"/' | bash
ゃ懵逼小萝莉 2024-12-04 04:49:06

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

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

即反转行,并从第六个参数开始获取名称,然后您必须相反以获得正确的文件名。)

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

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

You can do what Michał suggests. Also, if the metadata has a fixed number of words, you could do this easily like the following (supposing you process every line):

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

(that is, reverse the line, and take the name from the sixth parameter on, then you have to reverse to obtain the filename proper.)

If not, you can use the fact that all the images have an extension and that the extension itself doesn't have spaces, and search for the extension till the first space afterwards:

FILENAME=`echo $LINE | sed -e '/([^.]+) .*$/\1/'`
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文