使用 sed 用脚本替换 html 文件中的 URL 时出现问题

使用 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

循环会回显每个解析的文件,正确匹配脚本本身并跳过它,但实际上没有文件被更改。我已经为此折腾了好几天,真的很烦!

答案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

相关内容