Как заменить путь в файле новым путем с помощью sed?

Я использую sed, чтобы заменить путь в файле новым путем. Что здесь отсутствует или нет?

# sed -i `s|/$SPLUNK_HOME/bin/splunk|/opt/splunk/bin/splunk|g' filename 

Я получаю > с этим.

У вас есть обратная сторона ( ` ), открывающая инструкцию подзаголовка, которую вы никогда не завершаете. Убедитесь, что ваши кавычки совпадают.

Приглашение > – это оболочка, сообщающая вам, что она ищет больше ввода для незавершенной цитаты, представляя вам вторичное приглашение, определенное в PS2 .

Вы хотите использовать расширение параметра внутри своего скрипта, поэтому слабая цитата ( " ) – это цитата, которую нужно использовать.

Например:

 $ cat haystack I found some straw in here! $ needle=straw $ sed "s/$needle/pins/" haystack I found some pins in here! 

Давайте рассмотрим разницу между тем, что происходит, когда вы используете слабые цитаты ( " ) и сильные цитаты ( ' ):

 $ set -x $ sed "s/$needle/pins/" haystack + sed s/straw/pins/ haystack I found some pins in here! $ sed 's/$needle/pins/' haystack + sed 's/$needle/pins/' haystack I found some straw in here! 

Как вы можете видеть, при слабых кавычках расширение параметра для $needle происходит по завещанию оболочки, прежде чем sed когда-либо доберется до него. При сильных котировках этого не происходит, поэтому sed теперь ищет регулярное выражение /$needle/ , которое представляет собой «конец ввода, за которым следует строковая needle », которая никогда не будет соответствовать чему-либо, поэтому никаких замещений не производится.