Bash sed 命令给我 "invalid command code ."

Bash sed command gives me "invalid command code ."

我正在尝试通过替换 main.config.php 文件中特定行的 .js 块来自动化构建过程。当我运行以下代码时:

declare -a js_strings=("footer." "footerJQuery." "headerCSS." "headerJQuery.")

build_path="./build/build"
config_path="./system/Config/main.config.php"
while read -r line;
do
    for js_string in ${js_strings[@]}
    do
        if [[ $line == *$js_string* ]]
        then
            for js_file in "$build_path"/*
            do
                result="${js_file//[^.]}"
                if [[ $js_file == *$js_string* ]] && [[ ${#result} -eq 3 ]]
                then
                    sed -i "s/$line/$line$(basename $js_file)\";/g" $config_path
                fi
            done        
        fi
    done
done < "$config_path"

我收到这条消息,但文件还没有 updated/edited:

sed: 1: "./system/Config/main.co ...": invalid command code .

我无法在我的搜索中找到与此特定消息相关的任何内容。有谁知道我需要 change/try 来替换我的 .php 文件中的特定行?

更新后的脚本具有相同的消息:

declare -a js_strings=("footer." "footerJQuery." "headerCSS." "headerJQuery.")

build_path="./build/build"
config_path="./system/Config/main.config.php"

while read -r line;
do
    for js_string in ${js_strings[@]}
    do
        if [[ $line == *$js_string* ]]
        then
            for js_file in "$build_path"/*
            do
                result="${js_file//[^.]}"
                if [[ $js_file == *$js_string* ]] && [[ ${#result} -eq 3 ]]
                then
                    filename=$(basename $js_file)
                    newline="${line//$js_string*/$filename\";}"

                    echo $line
                    echo $newline
                    sed -i "s\$line\$newline\g" $config_path
                    echo ""
                fi
            done        
        fi
    done
done < "$config_path"

示例$line

$config['public_build_header_css_url'] = "http://localhost:8080/build/headerCSS.js";

示例$newline

$config['public_build_header_css_url'] = "http://localhost:8080/build/headerCSS.7529a73071877d127676.js";

已更新脚本,其中包含@Vercingatorix 建议的更改:

declare -a js_strings=("footer." "footerJQuery." "headerCSS." "headerJQuery.")

build_path="./build/build"
config_path="./system/Config/main.config.php"

while read -r line;
do
    for js_string in ${js_strings[@]}
    do
        if [[ $line == *$js_string* ]]
        then
            for js_file in "$build_path"/*
            do
                result="${js_file//[^.]}"
                if [[ $js_file == *$js_string* ]] && [[ ${#result} -eq 3 ]]
                then
                    filename=$(basename $js_file)
                    newline="${line//$js_string*/$filename\";}"

                    echo $line
                    echo $newline
                    linenum=$(grep -n "^${line}$" ${config_path} | cut -d':' -f 1 )
                    echo $linenum
                    [[ -n "${linenum}" ]] && sed -i "${linenum}a\
${newline}
                    ;${linenum}d" ${config_path}
                    echo ""

                fi
            done        
        fi
    done
done < "$config_path"

使用 seds 命令替换如此复杂的行是一个失败的提议,因为无论您选择什么定界符都可能出现在该行中并把事情搞砸。如果这些实际上是整行,最好删除它们并插入一个新行:

                linenum=$(fgrep -nx -f "${line}" "${config_path}" | awk -F : "{print $1}" )
                [[ -n "${linenum}" ]] && sed -i "" "${linenum}a\
${newline}
;${linenum}d" "${config_path}"

这样做是搜索整个匹配 $line 的行的行号,然后提取行号部分。 fgrep 是必需的,否则文件中的符号将被解释为正则表达式。如果匹配,则运行 sed,添加新行 (a) 并删除旧行 (d)。