我的目录中有一堆文件,我想在width
和 第一个>
.每个文件都有不同的width
值。
一个文件有:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="512px"
height="512px"><path //removed for brevity
另一个文件有:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="415px"
height="450px"><path //removed for brevity
ETC。
我想将它们替换为以下内容:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="{size}"
height="{size}" viewBox="0 0 512 512" fill={color}
class={$$props.class} {...$$restProps} aria-label={ariaLabel}><path
//removed for brevity
我尝试了以下方法,但它不起作用:
sed -i 's/width.*>/width={size} height={size} viewBox="0 0 512 512"
fill={color}
class={$$props.class} {...$$restProps} aria-label={ariaLabel}/' ./*.*
答案1
-i
sed
是一些(不是全部)实现借用的选项perl
。perl
在这里变得更容易:
perl -0777 -pi -e 's{\bwidth=".*?>}{width="{size}"
height="{size}" viewBox="0 0 512 512" fill={color}
class={\$\$props.class} {...\$\$restProps} aria-label={ariaLabel}>}gs' yourfile
在哪里:
-0777
将文件作为一个整体进行处理,而不是一次处理一行s{...}{...}
是另一种编写方式s/.../.../
,但不必担心/
模式或替换中的字符。{
,}
里面只要匹配就可以了。*?
是 的非贪婪版本*
。\b
width="
是单词边界,因此它与inminwidth="
例如不匹配。但它仍然会匹配min-width="
。如果这是一个问题,请将其替换为(?<=\s)
(代表只要前面有一个空格)。- 如果需要,该
s
标志可以跨越多行(也可以匹配换行符)。删除该标志以仅替换第一次出现的情况。.*
.
g
仅在<svg>
标签中执行此操作:
perl -0777 -pi -e 's{<svg[^<>]*\bwidth="\K.*?>}{{size}"
height="{size}" viewBox="0 0 512 512" fill={color}
class={\$\$props.class} {...\$\$restProps} aria-label={ariaLabel}>}gs' yourfile
答案2
您的问题可能是sed
按行工作,而svg
格式允许换行符,这似乎是这里的情况。因此,没有 后面width
跟有 a 的行>
,因此没有替换。
但情况可能更糟,因为该path
元素可能在同一行,所以它会被你的.*
!
我建议分别替换width
和height
:
sed 's/width="[^"]*/width="{size}/;s/height[^"]*"/height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel} /' ./*.*
- 我删除了该
-i
选项,测试前请勿重新添加 [^"]*
匹配所有不是 的字符"
,因此它可以防止您删除超出预期的字符- 我删除了代码中的换行符,因为我不知道它们是否是故意的。替换中的实际换行符前面需要有反斜杠
答案3
使用sed
。
$ sed -i.bak s'~\(width="\)[^>]*~\1{size}" height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel}~' input_file
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="{size}" height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel}><path //removed for brevity