我在sed中测试了单引号和双引号
me@host:~:
$ echo "front" | sed "s/front/back/"
back
me@host:~:
$ echo "front" | sed 's/front/back/'
back
Run Code Online (Sandbox Code Playgroud)
它们的表现相同,但我记得几个月前读到它们之间存在差异。
Google 搜索对关键字“sed 中的单引号和双引号”没有帮助。
它们不完全相同,对吧?
小智 6
这其实和bash有关,而不仅仅是命令sed。
通过查看这个例子你可以更好地理解它:
~ $ front="front"
~ $ echo "front" | sed "s/$front/back/"
back
~ $ echo "front" | sed 's/$front/back/'
front
Run Code Online (Sandbox Code Playgroud)
双引号计算内部的表达式,而单引号保留每个字符的字面值。更多信息在这里:/sf/ask/468842741/ Between-single-and-double-quotes-in-bash
我正在将我之前的评论扩展为答案。
我的建议是坚持使用单引号,除非您知道自己在做什么并且需要利用某些命令行功能。最常见的情况是文本字符串中的单引号和 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.
Run Code Online (Sandbox Code Playgroud)
似乎双引号启用了一些不错的功能,那么为什么不总是使用它们呢?对我来说,主要原因不是总能看到sed. 当命令用单引号括起来时,这非常简单:sed所见即所得。但是,当使用双引号时,您的字符串将在传递给 之前由外壳程序解释sed,您必须考虑任何修改,其中一些可能不是您想要的。这是一个很好的例子:
$ echo 'SELECT `date` FROM `services`' | sed 's/`date`/`uptime`/'
SELECT `uptime` FROM `services`
Run Code Online (Sandbox Code Playgroud)
如果您使用了双引号,那么您的实际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/'
Run Code Online (Sandbox Code Playgroud)
您通常可以使用与 连接的双引号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
Run Code Online (Sandbox Code Playgroud)
如果您正在编写awk或perl,事情会变得更加复杂,其中$有更多用途:
$ echo "col1 col2 col3" | awk '{print $1}'
col1
$ 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)
Run Code Online (Sandbox Code Playgroud)