我正在嘗試通過替換檔案中.js特定行的塊來自動化構建程序main.config.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
sed -i "s/$line/$line$(basename $js_file)\";/g" $config_path
fi
done
fi
done
done < "$config_path"
我收到此訊息,但檔案尚未更新/編輯:
sed: 1: "./system/Config/main.co ...": invalid command code .
我在搜索中找不到與此特定訊息相關的任何內容。有誰知道我需要更改/嘗試替換.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"
uj5u.com熱心網友回復:
使用sed'ss命令替換具有這種復雜性的一行是一個失敗的提議,因為您選擇的任何分隔符都可能出現在該行中并把事情搞砸。如果這些實際上是整行,最好洗掉它們并插入一個新的:
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)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/359468.html
上一篇:在多個專案上迭代類似的命令
