ディレクトリ内のすべてのファイルで参照されている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
の区切り文字として/
を使用することを選択しました関連の質問。
ループは解析された各ファイルをエコーアウトし、スクリプト自体に正しく一致してスキップしますが、実際にファイルが変更されることはありません。私はこれを数日間いじっており、本当にイライラしています!
Steeldriverで述べたように、単一引用符はすべてのシェル展開を抑制するため、$OLDSTR
は文字通りsed
に渡されます。実際にはファイル内で発生しないため、何にも一致しないため、何も実行されません。二重引用符を使用して、変数をsed
に渡すことができます。
sed -i -- "s#$OLDSTR#$NEWSTR#g" "$file"
ただし、おそらく一般的に強力な引用をオンまたはオフにし、通常どおり変数を二重引用する方が安全です
sed -i -- 's#'"$OLDSTR"'#'"$NEWSTR"'#g' "$file"
Regexxer を発見した後、私はsed
をいじることをあきらめました。 sed
の使用法は間違いありませんが、Regexxerははるかにシンプルで高速です。
Ubuntuリポジトリにあり、このコマンドでインストールできます。
Sudo apt-get install regexxer