bash - 在sed中,单引号和双引号

・3 分钟阅读

问题

我在sed中测试了单引号和双引号


me@host:~:


$ echo"front" | sed"s/front/back/"


back


me@host:~:


$ echo"front" | sed 's/front/back/'


back



他们的表现相同,但是,我记得他们几个月前就已经存在差异。

它们不一样,对吧?


回答1

除非你知道你正在做什么,并且需要利用一些命令行功能,我的建议是坚持单引号,最常见的情况是文本字符串内的单引号和shell变量插值。

下面是两个使用双引号的例子:


$ echo"We're good!" | sed"s/'re/ are/"


We are good!



$ name="John"; echo"Hello, I'm <name>." | sed"s/<name>/$name/"


Hello, I'm John.



似乎双引号启用了一些不错的功能,所以,为什么不总是使用它们呢?当命令包含在单引号中时,它非常简单: 你看到的正是sed所看到的,然而,在使用双引号时,shell将在传递到sed之前解释,并且必须考虑修改,下面是一个很好的例子:


$ echo 'SELECT `date` FROM `services`' | sed 's/`date`/`uptime`/'


SELECT `uptime` FROM `services`



如果你使用了双引号,这里是你的实际sed命令的内容:


$ sed"s/`date`/`uptime`/"


$ sed 's/Wed May 29 08:28:20 UTC 2019/ 08:28:20 up 13 days, 1:29, 1 user, load average: 0.08, 0.02, 0.00/'



你通常可以使用双引号与sed连接,因为$符号的使用往往是明确的:


$ line="back"; echo"front" | sed"s/front$/$line/"


back


$ line="back"; echo"frontline" | sed"s/front$/$line/"


frontline


$ line="-line"; echo"front-line" | sed"s/front$line/back$line/"


back-line



如果你正在编写awkperl,则事情变得更加复杂,其中$有更多用途:


$ echo"col1 col2 col3" | awk '{print $1}'


col1


simlev@v8:~$ echo"col1 col2 col3" | awk"{print $1}"


col1 col2 col3



$ echo"col1 col2 col3" | perl -lane 'print $F[0]'


col1


$ echo"col1 col2 col3" | perl -lane"print $F[0]"


ARRAY(0x564346f18db0)




回答2

这实际上与bash有关,而不仅仅是sed命令。

你可以通过查看以下例子来更好地了解它:


~ $ front="front"


~ $ echo"front" | sed"s/$front/back/"


back


~ $ echo"front" | sed 's/$front/back/'


front



双引号计算内部的表达式,而单引号保留每个字符的文字值。


Tianye profile image