_____SK_____
@_____SK_____

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

sedコマンドでテキストの置き換えをしたい

解決したいこと

sedコマンドを使って特定のフォルダ内にあるすべてのhtmlファイルの特定の文字列の置き換えをしたい。

とあるフォルダの中(直下以外も)にあるすべてのhtmlファイルのicon.svgという文字列をicon.pngに置き換えたいです。

色々調べたらsedコマンドというものがあったのですが、こんな感じのエラー?が出たりしてできなかったのでQiitaのみなさんに教えていただければ嬉しいです。

$ sed -i 's/icon.svg/icon.png/g' index.html(←実験的に一つのファイルだけやった)                  
sed: 1: "index.html": command i expects \ followed by text

実行環境

MacOS Ventura 13.5.2

0

2Answer

BSDのsedなら

find . -type f -name "*.html" | xargs sed -i '.bak' -e 's/icon.svg/icon.png/g'

とかでいかがでしょうか。
拡張子bakを付与したバックアップファイルを念の為作成しています。

2Like
echo icon.svg | sed 's/icon.svg/icon.png/'
echo * | sed 's/icon.svg/icon.png/'
echo * | grep icon.svg | sed 's/icon.svg/mv & icon.png/'

sedはストリームエディタなのでテキストのみの変換です。&はマッチした文字列

xargsでmvコマンドで実行でしょうか?

find . -name icon.svg

0Like

Comments

  1. @_____SK_____

    Questioner

    echo icon.svg | sed 's/icon.svg/icon.png/'
    echo * | sed 's/icon.svg/icon.png/'
    echo * | grep icon.svg | sed 's/icon.svg/mv & icon.png/'
    三つ全てやったんですが変換後のindex.htmlの文字列が返されました。

    index.htmlを上書きする形でできないでしょうか?

    あと、mvコマンドで実行っていうのはどういうことですか?

  2. 設問を理解していませんでした。

    特定のフォルダ内の *.html の複数のファイル内のテキストを編集する。

    sed -ie 's/icon.svg/icon.png/g' *.html
    

    mv index.html icon.png でリネームしたいと解釈しました。

  3. Mac に入っている BSD sed は -i オプションの引数が必須なので、 sed -ie ... と書くと e-i の引数になり、名前に e が付加されたバックアップファイルが作成されます。ファイル内置換をするなら sed -i '' -e ... と書くべきです。

  4. ご指摘有り難うございます。

Your answer might help someone💌