Как мне избежать двойных и одинарных кавычек в sed? - PullRequest
61 голосов
/ 22 сентября 2011

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

Например,

sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'

Я хочу заменить "http://www.fubar.com" на URL_FUBAR. Как sed должен распознавать мои // или мои двойные кавычки?

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Могу ли я использовать s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g?

Действительно ли \ экранирует символы в одинарных кавычках?

Ответы [ 9 ]

81 голосов
/ 22 сентября 2011

Команда sed позволяет вам использовать другие символы вместо / в качестве разделителя в своей команде s:

sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'

Двойные кавычки не являются проблемой.Для соответствия одинарных кавычек, переключите два типа кавычек вокруг.Обратите внимание, что строка в одинарных кавычках может не содержать одинарных кавычек (даже не экранированных).

Точки необходимо экранировать, если sed должен интерпретировать их как точки, а не как шаблон регулярного выражения .который соответствует любому одному символу.

23 голосов
/ 15 июля 2014

Что касается одинарных кавычек, см. Приведенный ниже код, используемый для замены строки let's на let us:

команда:

echo "hello, let's go"|sed 's/let'"'"'s/let us/g'

результат:

привет, поехали

11 голосов
/ 22 сентября 2011

Трудно избежать одинарной кавычки в одинарных кавычках. Попробуйте это:

sed "s@['\"]http://www.\([^.]\+).com['\"]@URL_\U\1@g" 

Пример:

$ sed "s@['\"]http://www.\([^.]\+\).com['\"]@URL_\U\1@g" <<END
this is "http://www.fubar.com" and 'http://www.example.com' here
END

производит

this is URL_FUBAR and URL_EXAMPLE here
9 голосов
/ 17 мая 2013

Моя проблема заключалась в том, что мне нужно было иметь "" вне выражения, поскольку у меня есть динамическая переменная внутри самого выражения sed.Таким образом, реальное решение состоит в том, что вместо Ленна Джекмана вы заменяете " внутри sed regex на [\"].

Итак, мой полный bash:

RELEASE_VERSION="0.6.6"

sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml

Вот:

# - это sed sed

[\"] = "в регулярном выражении

value = \"tags/$RELEASE_VERSION\" = моя замещающая строка, важно, что она содержит только \" для кавычек

1 голос
/ 15 июня 2016

Исключение двойной кавычки может быть абсолютно необходимым в sed: например, если вы используете двойные кавычки во всем выражении sed (как вам нужно делать, когда вы хотите использовать переменную оболочки).

Вот пример, который касается экранирования в sed, но также фиксирует некоторые другие проблемы цитирования в bash:

# cat inventory
PURCHASED="2014-09-01"
SITE="Atlanta"
LOCATION="Room 154"

Допустим, вы хотели изменить комнату, используя скрипт sed, который вы можете использовать снова и снова, поэтому вы можете варьировать входные данные следующим образом:

# i="Room 101" (these quotes are there so the variable can contains spaces)

Этот скрипт добавит всю строку, если ее там нет, или он просто заменит (используя sed) строку, которая там есть, текстом плюс значение $ i.

if grep -q LOCATION inventory; then 
## The sed expression is double quoted to allow for variable expansion; 
## the literal quotes are both escaped with \ 
    sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory
## Note the three layers of quotes to get echo to expand the variable
## AND insert the literal quotes
else 
    echo LOCATION='"'$i'"' >> inventory
fi

P.S. Я написал сценарий выше в несколько строк, чтобы сделать комментарии разбираемыми, но я использую его как однострочник в командной строке, который выглядит следующим образом:

i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi
0 голосов
/ 09 мая 2019

В стороне: выражения sed, содержащие переменные BASH, должны быть двойными (") - в кавычках для правильной интерпретации переменной.

Если вы также заключите двойную кавычку в переменную $ BASH (рекомендуется)

... тогда вы можете экранировать двойные кавычки переменных, как показано:

sed -i "s/foo/bar ""$VARIABLE""/g" <file>

Т.е. замените связанный с $ VARIABLE " на "".

(Простое экранирование "$VAR", поскольку \"$VAR\" приводит к " кавычкам выходной строки.)


Примеры

$ VAR='apples and bananas'
$ echo $VAR
apples and bananas

$ echo "$VAR"
apples and bananas

$ printf 'I like %s!\n' $VAR
I like apples!
I like and!
I like bananas!

$ printf 'I like %s!\n' "$VAR"
I like apples and bananas!

Здесь $ VAR * цитируется " перед передачей в sed (sed является ' - или " в кавычках):

$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/"$VAR"/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/""$VAR""/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed "s/$VAR/cherries/g"
I like cherries!

$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!

Сравните это с:

$ printf 'I like %s!\n' $VAR | sed "s/$VAR/cherries/g"
I like apples!
I like and!
I like bananas!


$ printf 'I like %s!\n' $VAR | sed "s/""$VAR""/cherries/g"
I like apples!
I like and!
I like bananas!

... и так далее ...

Заключение

Моя рекомендация, как стандартная практика, заключается в

  • " -квотные переменные BASH ("$VAR")
  • " -цитатура, снова , эти переменные (""$VAR""), если они используютсяв выражении sed (которое само должно быть " в кавычках, а не ' в кавычках)
$ VAR='apples and bananas'

$ echo "$VAR"
apples and bananas

$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!

0 голосов
/ 27 апреля 2017
Prompt% cat t1
This is "Unix"
This is "Unix sed"
Prompt% sed -i 's/\"Unix\"/\"Linux\"/g' t1
Prompt% sed -i 's/\"Unix sed\"/\"Linux SED\"/g' t1
Prompt% cat t1
This is "Linux"
This is "Linux SED"
Prompt%
0 голосов
/ 22 сентября 2011

Вам необходимо использовать \ "для экранирования" символа (\ экранировать следующий символ

sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'
0 голосов
/ 22 сентября 2011

Может быть символ "\", попробуйте это:

sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...