使用 find + sed 为目录中的每个 SVG 添加标记

使用 find + sed 为目录中的每个 SVG 添加标记

我有一个包含数百个 SVG 文件的目录,这些文件基本上都是小图标。我想<title>icon name</title>使用其文件名作为内容向每个图标添加一个元素,用空格替换所有连字符并删除扩展名。

作为示例,文件如下arrow-down-narrow.svg

<svg width="21" height="21" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M10.5 3.625a.75.75 0 0 1 .743.648l.007.102v10.438l2.22-2.218a.75.75 0 0 1 1.133.976l-.073.084-3.5 3.5a.754.754 0 0 1-.078.069l-.006.004h-.002l-.008.007a.747.747 0 0 1-.081.051l-.015.008a.744.744 0 0 1-.11.045l-.009.003a.707.707 0 0 1-.221.033h-.028a.754.754 0 0 1-.046-.004l-.028-.003-.012-.002a.752.752 0 0 1-.085-.018l-.025-.007a.747.747 0 0 1-.068-.025l-.028-.012a.744.744 0 0 1-.21-.149l-3.5-3.5a.75.75 0 0 1 .976-1.133l.084.073 2.22 2.219V4.375a.75.75 0 0 1 .75-.75z" fill="#000" fill-rule="nonzero"/></g></svg>

理想情况下,此更新将产生以下标记:

<svg width="21" height="21" xmlns="http://www.w3.org/2000/svg"><title>arrow down narrow</title><g fill="none" fill-rule="evenodd"><path d="M10.5 3.625a.75.75 0 0 1 .743.648l.007.102v10.438l2.22-2.218a.75.75 0 0 1 1.133.976l-.073.084-3.5 3.5a.754.754 0 0 1-.078.069l-.006.004h-.002l-.008.007a.747.747 0 0 1-.081.051l-.015.008a.744.744 0 0 1-.11.045l-.009.003a.707.707 0 0 1-.221.033h-.028a.754.754 0 0 1-.046-.004l-.028-.003-.012-.002a.752.752 0 0 1-.085-.018l-.025-.007a.747.747 0 0 1-.068-.025l-.028-.012a.744.744 0 0 1-.21-.149l-3.5-3.5a.75.75 0 0 1 .976-1.133l.084.073 2.22 2.219V4.375a.75.75 0 0 1 .75-.75z" fill="#000" fill-rule="nonzero"/></g></svg>

这可能吗?

我正在玩弄这个,这似乎让我走上了正确的道路,但我完全不熟悉 sed 并且遇到了错误sed: RE error: illegal byte sequence

find . -name "*" -type f -print | xargs sed -i '' -e 's:svg">:svg">HELLO:g'

答案1

这是一个简单的解决方案。搜索 pwd 中的所有 svg 文件。将第一个 > 字符替换为 > + 标题标签信息。 find 中的文件名带有前缀,./$f.

如果所有 svg 文件都以 svg 标签开头,如 OP 所示,这将起作用。这不适用于文件名中的空格。

<svg width="21" height="21" xmlns="http://www.w3.org/2000/svg"><g fill="none"...

<svg width="21" height="21" xmlns="http://www.w3.org/2000/svg"><title>test.svg</title><g fill="none"...

仅使用一个 svg 文件对此进行了测试。备份原始文件。 svg目录下的命令:

find . -iname '*.svg' -exec bash -c 'f=$(printf $0|sed s_./__);sed -i s_\>_\>\<title\>$f\<\/title\>_ $0' {} \;

相关内容