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"
使用 sed
的 s
命令替换如此复杂的行是一个失败的提议,因为无论您选择什么定界符都可能出现在该行中并把事情搞砸。如果这些实际上是整行,最好删除它们并插入一个新行:
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
)。
我正在尝试通过替换 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"
使用 sed
的 s
命令替换如此复杂的行是一个失败的提议,因为无论您选择什么定界符都可能出现在该行中并把事情搞砸。如果这些实际上是整行,最好删除它们并插入一个新行:
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
)。