【问题标题】:Syntax of sed commandsed 命令的语法
【发布时间】:2015-05-05 06:57:05
【问题描述】:

我在服务器“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 命令。

【问题讨论】:

  • 您期望发生什么?会发生什么?
  • 我已经提到我的dailyconfig.yml文件中有一行如下logFiles:["responseActions.csv.2015-04-24","re​​sponseActions.csv.2015-04 -25","re​​sponseActions.csv.2015-04-26"] 我需要在 while 循环中迭代地替换这一行中的日期。对于那些日期,您可以在我的脚本中看到日期计算。注意:脚本中所有的 echo 部分只是为了确认日期是否被正确处理以及循环是否正常工作。

标签: linux bash shell sed


【解决方案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的意思是当有多个匹配时,在同一行重复匹配。

【讨论】:

  • 哇哦。它对我有用...非常感谢您的帮助。我真的很感激。
【解决方案2】:
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
  • action 可以由新行或; 或最终在几个-e "Action" 中分隔
  • 我使用除/ 之外的其他分隔符,因为日期和文件名可以使用此分隔符,但如果变量内容或模式中没有/,则不是强制性的
  • g 是可选的,因为它每行只处理 1 次出现

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 2019-06-24
    • 1970-01-01
    • 2014-12-13
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多