首页 > 解决方案 > sed 替换引号中的字符串;带有反向引用;外壳脚本

问题描述

我在这方面工作太久了,所以我怀疑我错过了一些基本的东西。

很抱歉,这可能是有据可查的,但我已阅读,但我仍然没有得到它。

我正在尝试替换一行上的日期。原行内容如下:

date = "2020-11-01"

我试图用今天的日期替换那个日期,所以我有:

text_date="$(date +%Y\-%m\-%d)"
sed -i 's/(date = ")*(")/\1'"$text_date"'\2/g' "$post_dir"/index.md

我尝试转义空格和引号(以及等号),但我感到很沮丧。

我目前收到一个错误:

sed: -e expression #1, char 33: invalid reference \1 on `s' command's RHS

知道会发生什么吗?太感谢了!

标签: shellsedzsh

解决方案


在 bash 中,引号的作用更像是通过 shell 控制字符扩展的开关,而不是字符串的开头和结尾(有关详细说明,请参阅这个很棒的站点)。因此,您可以“关闭单引号(防止扩展),放置新数据,然后“重新打开单引号”:

sed 's/\(date = \).*/\1"'$(date +%Y\-%m\-%d)'"/' your_file

一旦您确认这是在做您想做的事,您可以添加-i以就地进行替换:

sed -i 's/\(date = \).*/\1"'$(date +%Y\-%m\-%d)'"/' your_file

推荐阅读