我在服务器“dailyconfig.yml”上有一个文件,其中包含以下行
logFiles: ["responseActions.csv.2015-04-24","responseActions.csv.2015-04-25","responseActions.csv.2015-04-26"]
我必须使用sed命令更改每个文件的日期。
我的脚本如下。
echo -n "Enter first date (format: YYYY-mm-dd): "
read startDate
echo "startDate outside loop: $startDate"
echo -n "Enter last date (format: YYYY-mm-dd): "
read endDate
echo "endDate outside loop: $endDate"
d1=$(date -d "$endDate" +%s)
echo "d1 = $d1"
d2=$(date -d "$startDate" +%s)
echo "d2 = $d2"
datediff=$(($(((d1-d2)/86400))+1))
echo "datediff = $datediff"
count=1
echo "count outside loop: $count"
while test $count -le $datediff
do
echo "count=$count"
echo "datediff=$datediff"
echo "Entered in loop"
date1=`date +%Y-%m-%d -d "$startDate -1 day"`
echo "date1 = $date1"
date2=`date +%Y-%m-%d -d "$startDate +1 day"`
echo "date2 = $date2"
sed -i "s/startDate:.*18:30:00/startDate: $date1 18:30:00/g" configdaily.yml
sed -i "s/endDate:.*18:30:00/endDate: $startDate 18:30:00/g" configdaily.yml
**sed -i "s/logFiles:*]/logFiles: [\"responseActions.csv.$date1\",\"responseActions.csv.$startDate\",\"responseActions.csv.$date2\"]/g" configdaily.yml**
sleep 10
startDate=$(date +%Y-%m-%d -d "$startDate +1 day")
echo " startDate inside loop: $startDate"
count=$((count+1))
echo "count inside loop: $count"
done
在上面的脚本中,您可以看到三个sed命令,其中第三个sed命令不提供所需的输出。
因此请在第三个sed命令中建议正确的语法或更改。
答案 0 :(得分:1)
您使用logfiles:*
似乎意味着logfiles:.*
。表达式:*
表示文字冒号字符的重复次数为零或更多。表达式.*
表示任何字符的重复次数为零或更多(另请注意.
如何匹配除换行符之外的任何单个字符的元字符。)
切向地,在同一个文件上运行三个连续的sed
脚本有点浪费。您应该能够将它们组合成一个脚本:
sed -i -e "s/startDate:.*18:30:00/startDate: $date1 18:30:00/" \
-e "s/endDate:.*18:30:00/endDate: $startDate 18:30:00/" \
-e "s/logFiles:.*]/logFiles: [\"responseActions.csv.$date1\",\"responseActions.csv.$startDate\",\"responseActions.csv.$date2\"]/" configdaily.yml
我还删除了所有这些上的/g
标记,因为看起来任何模式都不可能在同一行上匹配多次。 g
的含义是当有多个匹配时在同一行重复匹配。
答案 1 :(得分:0)
sed -i "
s#startDate:.*18:30:00#startDate: ${date1} 18:30:00#g
s#endDate:.*18:30:00#endDate: $startDate 18:30:00#g
s#logFiles:*]#logFiles: [\"responseActions.csv.${date1}\",\"responseActions.csv.${startDate}\",\"responseActions.csv.${date2}\"]#g" configdaily.yml
;
或最终在多个-e "Action"
/
,因为日期和文件名可以使用它,但如果/
不在变量内容或模式中,则不是必需的g
是可选的,因为它每行仅处理1次