【发布时间】:2017-07-20 16:01:42
【问题描述】:
我正在尝试编写一个 bash 脚本,该脚本将在 conf 文件中查找过时的条目并使用新值更新它们。
旧的 conf 文件将有两个条目(-CAR 和 -BIKE)。例如,
#Following are the entries in the conf file
#-CAR yes/no default set to no
#-BIKE yes/no default set to no
-CAR yes
-BIKE no
现在这个 bash 脚本应该对这些条目进行 grep 并将它们替换为单个条目作为 -DRIVING_LEVEL (car/bike/none)。
逻辑如下: 如果 -CAR 设置为 yes,则 DRIVING_LEVEL 将为“汽车”。 如果 -CAR 设置为 no 并且 -BIKE 设置为 yes,则 DRIVING_LEVEL 将是“自行车”。 如果 -CAR 和 -BIKE 都设置为 none,则 DRIVING_LEVEL 将为“none”。
我已经编写了下面的脚本,它可以做到这一点。
#!/bin/bash
CONF_FILE="license.conf"
grep -w $CONF_FILE -e '-CAR' -e '-BIKE' > /dev/null
if [ $? -eq 0 ]
then
echo "Old values are present"
var=$(grep -w $CONF_FILE -e '-CAR')
if [ $? -eq 0 ]
then
temp="${var##*$'\n'}"
option=$(echo $temp | sed 's/.* //g')
echo $option
if [ "$option" == "yes" ]; then
car=1
elif [ "$option" == "no" ]; then
car=0
fi
echo "Deleting $var"
sed -i '/-CAR/d' $CONF_FILE
fi
var2=$(grep -w $CONF_FILE -e '-BIKE')
if [ $? -eq 0 ]
then
temp2="${var2##*$'\n'}"
option=$(echo $temp2 | sed 's/.* //g')
echo $option
if [ "$option" == "yes" ]; then
bike=1
#echo $temp
elif [ "$option" == "no" ]; then
bike=0
fi
echo "Deleting $var2"
sed -i '/-BIKE/d' $CONF_FILE
fi
if [ "$car" == "1" ]; then
driving_level="car"
elif [ "$bike" == "1" ]; then
driving_level="bike"
else
driving_level="none"
fi
echo "Appending -DRIVING_LEVEL $driving_level"
echo "-DRIVING_LEVEL $driving_level" >> $CONF_FILE
else
echo "No old values"
fi
问题是我认为这太长了,可以使用 sed 或 awk 命令缩短。但我做不到。我希望它尽可能短。
提前致谢!
注意:
我使用 temp="${var##*$'\n'}" 来检索具有实际值的最后一行,因为 grep 将给出包含-自行车。
我使用了 option=$(echo $temp | sed 's/.* //g'),因为 -BIKE 和 yes/no 之间可以有任意数量的空格.
【问题讨论】:
-
感谢您在这里展示您的努力,能否请您也展示此逻辑和示例 Input_file 的预期输出,也请分享到您的帖子中。
-
@RavinderSingh13 感谢您的回复。输入文件将类似于我在问题中提到的。输出应该是 conf 文件应该只包含 -DRIVING_LEVEL 条目,该条目将被设置为 car、bike 或 none。希望能回答你的问题!