sed 命令将 $Date$ 替换为 $Date: 2021-01-06

sed 命令将 $Date$ 替换为 $Date: 2021-01-06

我需要使用sed命令来搜索文本文件并替换$Date$为: 日期的文本在$Date: 2021-01-06... $ 哪里。...

我有一个sed命令可以搜索Date并将其替换为 Date: 2021-01-06...

sed "s/Date/Date $(date)/"

但我无法让sed命令来替换$Date$

另外,我能够获得一个sed命令来替换$Date usingsed "s/\$Date/\$Date $(date)/" 但我无法弄清楚搜索和替换的语法$Date$

我试过:

sed "s/\$Date\$/\$Date $(date) \$/"

但它不起作用。

答案1

我尝试过:sed "s/\$Date\$/\$Date $(date) \$/"但它不起作用。

因为\$双引号中只告诉 shell 不要解释(展开)$,但是还有sed.它获取s/$Date$/$Date … $/(其中表示$(date)扩展为的内容)并将第二个解释$为与行尾匹配的锚点。 Ins/regexp/replacement/ $被解释为仅在 末尾的锚点regexp。所以你$也需要逃避这个特殊的sed,即你需要sed从字面上得到\$。这可以通过以下方式完成:

sed "s/\$Date\\$/\$Date $(date) \$/"

或者

sed "s/\$Date\\\$/\$Date $(date) \$/"

$它适用于两个或三个反斜杠,因为之前的双引号/不需要(但可能)被转义,并且可以让\您需要\\双引号。这有点复杂,因此请考虑用单引号引用所有不需要双引号的片段:

sed 's/$Date\$/$Date '"$(date)"' $/'

这里所有$应该到达的字符sed都是单引号的;唯一\应该到达的sed也是单引号。

答案2

为了减少反斜杠,我们将使用GNU sed其扩展正则表达式模式-E打开。另外,我们将使用后引用括号来进一步减少 s/// 命令的右侧。另外,我们在字符类中使用美元[...]被视为文字。

sed -Ee "s/([\$]Date)([\$])/\1 $(date) \2/"

或者,我们可以如图所示:

sed -e '/\($Date\)\$/ '"s//\1 $(date) \$/"

相关内容