Я протестировал одинарные и двойные кавычки в sed
me@host:~:
$ echo "front" | sed "s/front/back/"
back
me@host:~:
$ echo "front" | sed 's/front/back/'
back
Они выполнялись одинаково, но я вспомнил, что читал, что существуют различия между ними несколько месяцев назад.
Поиск в Google бесполезен с ключевыми словами «одинарные кавычки и двойные кавычки в sed».
Они не идентичны, верно?
Я расширяю свои предыдущие комментарии в ответ.
Мой совет - придерживаться одинарных кавычек, если вы не знаете, что делаете, и вам не нужно использовать некоторые функции командной строки. Наиболее распространенные случаи, которые приходят на ум, - это одинарные кавычки внутри текстовых строк и интерполяция переменных оболочки.
Вот пара примеров, в которых использование двойных кавычек имеет смысл:
$ 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
. Это очень просто, когда команда заключена в одинарные кавычки: то, что вы видите, это именно то, что видит sed
. Однако при использовании двойных кавычек ваша строка будет интерпретироваться оболочкой, прежде чем она будет передана в 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)
Это на самом деле связано с bash, а не только с командой sed
.
Вы можете понять это лучше, посмотрев на этот пример:
~ $ front="front"
~ $ echo "front" | sed "s/$front/back/"
back
~ $ echo "front" | sed 's/$front/back/'
front
Двойные кавычки оценивают выражение внутри, тогда как одинарные кавычки сохраняют буквальное значение каждого символа. Более подробная информация здесь: https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash