我试图将当前日期作为月/日(即 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
)。