如何在特定单词和字符之间进行替换

如何在特定单词和字符之间进行替换

我的目录中有一堆文件,我想在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

-ised是一些(不是全部)实现借用的选项perlperl在这里变得更容易:

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/.../.../,但不必担心/模式或替换中的字符。{}里面只要匹配就可以了。
  • *?是 的非贪婪版本*
  • \bwidth="是单词边界,因此它与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元素可能在同一行,所以它会被你的.*!

我建议分别替换widthheight

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

相关内容