使用 bash 脚本将当前日期写入 .cfg/文本文件

使用 bash 脚本将当前日期写入 .cfg/文本文件

我试图将当前日期作为月/日(即 6/18)打印到 .cfg 文件中(使用 sed 因为我需要更改特定行)。但是,运行 bash 时,输出中的日期是正确的,但在检查文件时,它打印的是命令而不是日期。有什么建议么?

sed -i -- 's/^example=.*/example="$(date)"/g' /path/to/config.cfg

另外,日期只是打印完整日期(2020 年 6 月 18 日星期四 19:34:14 EDT),我只需要月份/日期。

先感谢您!!!

答案1

shell 永远不会扩展单引号字符串内的任何内容。

您必须在sed表达式中使用双引号字符串:

sed -i "s,^\(example=\).*,\1$(date +%m/%d)," /path/to/config.cfg

或者,使用两个单引号字符串,并在它们之间用双引号替换命令:

sed -i 's,^\(example=\).*,\1'"$(date +%m/%d)"',' /path/to/config.cfg

或者,让date输出sed表达式:

sed -i "$(date +'s,^\(example=\).*,\1%m/%d,')" /path/to/config.cfg

(但这看起来有点尴尬)。

我通过文本的反向引用将表达式变短了一点example=。我使用in,作为s///命令的分隔符,sed因为我们正在处理包含字符的替换部分中的字符串/(替代方案是用作%m\\/%d格式字符串来date生成转义/字符)。

请注意,在上述命令的第一个变体中,不需要在命令替换周围使用双引号,因为整个sed表达式都被引用。此外,不需要/g命令末尾的 ,s///因为您不能期望模式匹配多次,因为它锚定到行的开头。我也删除了--你使用的。一些sed实现几乎肯定会使用该字符串作为备份后缀,即作为选项的选项参数-i(例如sed在 macOS 上)。

我用来date +%m/%d生成所需的日期格式。这将生成06/19今天的日期。如果您不想当天的数字用零填充,请使用%e代替%d(请参阅man strftime)。似乎没有一个标准格式可以在不用零填充数字的情况下获取月份,但是如果您使用 GNU,date则可以使用非标准%-m格式(即date +%-m/%e,请参阅man date)。

相关内容