我编写了一个脚本,该脚本应该用本地地址替换目录中所有文件中引用的 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
循环会回显每个解析的文件,正确匹配脚本本身并跳过它,但实际上没有文件被更改。我已经为此折腾了好几天,真的很烦!
答案1
正如steeldriver所提到的,单引号会抑制所有shell扩展,因此$OLDSTR
会逐字传递给sed
。由于它实际上并未出现在文件中,因此它与任何内容都不匹配,因此什么也不做。您可以sed
使用双引号将变量传递给:
sed -i -- "s#$OLDSTR#$NEWSTR#g" "$file"
但也许一般来说更安全的做法是打开和关闭强引用,并像平常一样对变量进行双引号引用
sed -i -- 's#'"$OLDSTR"'#'"$NEWSTR"'#g' "$file"
答案2
sed
好吧,我发现后就放弃了正则表达式,这正是我所需要的。sed
毫无疑问,它有其用途,但 Regexxer 更简单,速度更快。
它在 Ubuntu 存储库中可用,可以使用以下命令安装
sudo apt-get install regexxer