web-dev-qa-db-ja.com

sedを使用してHTMLファイル内のURLをスクリプトに置き換える際の問題

ディレクトリ内のすべてのファイルで参照されているURLをローカルアドレスに置き換えるスクリプトを作成しましたが、機能していないようです。私は間違っています。

私のスクリプトは次のとおりです。

#!/bin/bash
#script to replace OLDSTR with NEWSTR in all files in the directory the script is run from
OLDSTR="http://some.external.url/path/to/file"
NEWSTR="file:///local/path/to/file"

( shopt -s globstar dotglob;
    for file in **; do
        if [[ -f $file ]] && [[ -w $file ]]; then
            if [ $file != ".fix" ]; then
                echo "sed -i -- 's#$OLDSTR#$NEWSTR#g' "$file""
                sed -i -- 's#$OLDSTR#$NEWSTR#g' "$file"
            else
                echo "Skipped self"
            fi
        fi
    done
)

URLとネイティブUNIXパスを使用しているため、他のsedへの回答で頻繁に使用される#ではなく、sedの区切り文字として/を使用することを選択しました関連の質問。

ループは解析された各ファイルをエコーアウトし、スクリプト自体に正しく一致してスキップしますが、実際にファイルが変更されることはありません。私はこれを数日間いじっており、本当にイライラしています!

2
Seann

Steeldriverで述べたように、単一引用符はすべてのシェル展開を抑制するため、$OLDSTRは文字通りsedに渡されます。実際にはファイル内で発生しないため、何にも一致しないため、何も実行されません。二重引用符を使用して、変数をsedに渡すことができます。

 sed -i -- "s#$OLDSTR#$NEWSTR#g" "$file"

ただし、おそらく一般的に強力な引用をオンまたはオフにし、通常どおり変数を二重引用する方が安全です

 sed -i -- 's#'"$OLDSTR"'#'"$NEWSTR"'#g' "$file"
3
Zanna

Regexxer を発見した後、私はsedをいじることをあきらめました。 sedの使用法は間違いありませんが、Regexxerははるかにシンプルで高速です。

Ubuntuリポジトリにあり、このコマンドでインストールできます。

Sudo apt-get install regexxer
1
Seann