linux - sed 命令的语法

标签 linux bash shell sed

我在服务器“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 命令中建议正确的语法或更改。

最佳答案

看来您正在使用 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的意思是当有多个匹配时,在同一行重复匹配。

关于linux - sed 命令的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30046139/

相关文章:

Python Tkinter 旋转窗口,向右转

linux - 在步骤 'Retrieving needed toolchain components' tarball 中构建失败

linux - 如何将一行 Bash 脚本分隔成多行?

linux - awk初学者试图理解awk "thought process"

c - 为什么此代码在编译时会生成错误 'undefined reference to main'?

linux - 如何在第 n 行文件的中间插入文本

linux - bash:如何将文件 `cat` 之后的所有变量名替换为它们的值?

linux - 我想用脚本重命名超过 20k 的文件,但它失败了 : "argument list too long"

Linux Debian 9 守护进程标准输入 (bash)

bash - 如何在 bash 命令中转义双引号