одинарные и двойные кавычки в седе

Я протестировал одинарные и двойные кавычки в sed

me@host:~:
$ echo "front" | sed "s/front/back/"
back
me@host:~:
$ echo "front" | sed 's/front/back/'
back

Они выполнялись одинаково, но я вспомнил, что читал, что существуют различия между ними несколько месяцев назад.

Поиск в Google бесполезен с ключевыми словами «одинарные кавычки и двойные кавычки в sed».

Они не идентичны, верно?

2
задан 28 May 2019 в 13:32

2 ответа

Я расширяю свои предыдущие комментарии в ответ.

Мой совет - придерживаться одинарных кавычек, если вы не знаете, что делаете, и вам не нужно использовать некоторые функции командной строки. Наиболее распространенные случаи, которые приходят на ум, - это одинарные кавычки внутри текстовых строк и интерполяция переменных оболочки.

Вот пара примеров, в которых использование двойных кавычек имеет смысл:

$ 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)
0
ответ дан 28 May 2019 в 13:32

Это на самом деле связано с 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

0
ответ дан 28 May 2019 в 13:32

Другие вопросы по тегам:

Похожие вопросы: