【发布时间】:2016-08-26 04:14:43
【问题描述】:
我需要一个 bash 脚本,它应该执行以下操作: - 从输入文件中逐行读取,格式为:[Environment]=[file name]=[property key]=[property value] - 它将根据输入文件通过替换 $SOURCE 目录中的所有属性来修改所有文件。 现在我被困在“替换和计数”这一点上。
直到“替换和计数”阶段的代码:
PROPERTIES_LIST=/home/user/test_scripts/envPropList.txt
SOURCE=/home/user/test_scripts/source-directory
PROPERTIES_LOCATION=/WEB-INF/classes/
PROPERTIES_SOURCE=$SOURCE$PROPERTIES_LOCATION
ENV=$1
echo "> Update for ENVIRONMENT: $ENV... Please wait!"
NR=1
while read line; do
IFS== read env prop <<< "$line"
if [[ $env == $ENV]]
then
IFS== read file key value <<< "$prop"
if [[ -z $file ]] || [[ -z $key ]] || [[ -z $value ]]
then
echo "> [ERROR] [LINE $NR] - WRONG/MISSING PROPERTY: $line"
else
//MODIFY $file BY REPLACE AND COUNT
//IF $key IS NOT FOUND AT ALL AN ERROR MESSAGE SHOULD BE DISPLAYED. ITERATION SHOULD CONTINUE
//IF $key IS FOUND MORE THEN ONCE, A WARNING MESSAGE SHOULD BE DISPLAYED. ITERATION SHOULD CONTINUE
echo "done"
fi
fi
NR=$(( $NR + 1 ))
done <$PROPERTIES_LIST
我尝试了以下但没有成功,因为属性中的值可以是任何字符(例如:&、/、....):
COUNT=$(grep -c "$key" $PROPERTIES_SOURCE$file)
sed -i "s/${OLD}/${NEW}/g" $PROPERTIES_SOURCE$file
awk 也没有按预期工作:
DEST=/home/user/test_scripts/test.txt
OLD='asd.asd'
NEW='test/test?test.test&test=test'
COUNT=$(grep -c "$OLD" $DEST)
#sed -i "s/#${OLD}#/#${NEW}#p/g" $DEST
#echo "$OLD=$NEW"
echo "nr de rezultate: "$COUNT
awk -v OLD=$OLD -v NEW=$NEW '
($0 ~ OLD) {gsub(OLD, NEW); count++}1
END{print count " substitutions occured."}
' "$DEST"
对于输入文件:
asd.asd
ewrqfg
qweasd.asdqwreqe
asd asd.asd
egd
test
我有以下输出:
test/test?test.testasd.asdtest=test
ewrqfg
qwetest/test?test.testasd.asdtest=testqwreqe
test/test?test.testasd asdtest=test.asd
egd
test
如果我从 $NEW 中删除“&”,一切都会正常。
【问题讨论】:
标签: bash awk replace sed count