bash - 在sed中,单引号和双引号
Tianye
・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
如果你正在编写awk
或perl
,则事情变得更加复杂,其中$
有更多用途:
$ 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
双引号计算内部的表达式,而单引号保留每个字符的文字值。