特定の単語や文字を置き換える方法

特定の単語や文字を置き換える方法

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

など。

私はそれらを次に変えたいと思います:

<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一度に1行ではなくファイル全体を処理します。
  • s{...}{...}は別の書き方ですが、パターンや代替文字s/.../.../について心配する必要はありません。 、一致する限り。/{}
  • *?はい、貪欲ではないバージョンです*
  • \bwidth="は単語の境界なので、たとえば一致しませんminwidth="。しかし、まだ一致しています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

フォーマットが改行を許可している間、問題はsed1行ずつ機能する可能性があります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

関連情報