2017-02-19 21 views
1

Я хочу задать 2 вопроса о sed.Разделительные команды sed sed 's ///' и sed "s ###"

Например, когда я пытаюсь поместить строку в sed, которая содержит специальный символ, подобный (. \ N *. +), И sed не может работать должным образом.

set a = ".\n*.\+" 
set input = ".\n*.\+adsdfasdf" 

Затем выполните:

echo "$input" | sed 's/'$a'/hi/g' # It will give: sed: No match 

но

echo "$input" | sed "s#${a}#hi#g" # It will run but not true 

Мои вопросы:

  1. В чем разница между этими командами: СЭД 's ///' и sed "s ###"
  2. Как обрабатывать ввод так же, как чисто строку?
+0

оба дают «hi» как результат для меня в оболочке bash и GNU sed 'a =". \ N *. \ + "; ". \ П * \ + adsdfasdf" вход =; echo "$ input" | sed 's /' $ a '/ hi/g'' .... см. https://stackoverflow.com/documentation/sed/1096/substitution#t=201702190808137883167 для получения некоторых объяснений при использовании разных разделителей. – Sundeep

+0

afaik, нет способа сказать sed, что строка должна рассматриваться как буквальная, вам придется избегать метасимволов, а также используемого разделителя – Sundeep

ответ

0

1. В чем разница между этими командами: СЭД «s ///» и СЭД «s ###»
--- В вашем случае, / или # является сепаратором критические «секции»:

сек команда (как заменитель), вероятно, является наиболее важным в SED и имеет много различных вариантов. Синтаксис команды s: 's/regexp/replacement/flags'.
...
В / символы могут быть равномерно заменены любым другим символом в любом заданной s команды.


2. Как лечить вход так же, как это чисто строка?
--- Для того, чтобы развернуть/интерполировать переменные в sed команды, эти переменные или все выражение должно быть заключено с двойные кавычки:

set a = ".\n*.\+" 
echo "$input" | sed "s/$a/hi/g" 
-1

Наконец, я обнаружил, что сепаратор ДОЛЖЕН БЫТЬ разные с любыми символами в строке! Или это вызовет ошибку!

Таким образом, теперь я поменяю разделитель на #. Это похоже на характер комментария.

+0

Было замечено, что когда разделитель sed установлен в/и ваши шаблоны также содержать/вам нужно их избежать. Выбирая другой разделитель (например, |, # и т. Д.), Который НЕ присутствует в ваших шаблонах, вы уменьшаете экранирование. –

+0

Спасибо. Я, наконец, понял. – TuanLaDaPoet

+0

Здравствуйте, и добро пожаловать в переполнение стека. Пожалуйста, не оставляйте комментарии в качестве ответов - только контент, который на самом деле пытается ответить на вопрос, должен быть опубликован с помощью кнопки «Опубликовать свой ответ». Модератор может преобразовать это в комментарий, но обычный способ сказать спасибо здесь - нажать стрелку вверх рядом с вещами, которые вам нравятся, и, возможно, зеленый галочку рядом с ответом, который вам больше всего нравится. – tripleee

0

Ну, у вас есть во входной строке, которую вы замещать без кавычек разделителей в 's/'$a'/hi/g' и анализируется как пространстве \n, поэтому вы передаете фактически двух параметров sed(1) и вы заменяете как только один параметр (с \n включен как один символ) только в одном параметре в "s#$a#hi#g" (в котором двойные кавычки включают замену переменных).На самом деле нет разницы в символе, используемом в качестве разделителя в sed(1), но вы назвали его по-разному в двух вызовах.