我需要使用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) \$/"