Подтвердить что ты не робот

Как мне избежать двойных и одинарных кавычек в sed?

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

Например,

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

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

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

EDIT: Могу ли я использовать s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g?

Выполняет ли\избегать символов внутри одиночных кавычек?

4b9b3361

Ответ 1

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

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

или

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

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

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

Ответ 2

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

Команда:

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

результат:

привет, пойдем

Ответ 3

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

sed "[email protected]['\"]http://www.\([^.]\+).com['\"]@URL_\U\[email protected]" 

Пример:

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

производит

this is URL_FUBAR and URL_EXAMPLE here

Ответ 4

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

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

RELEASE_VERSION="0.6.6"

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

Вот:

# - разделитель sed

[\"]= " в regex

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

Ответ 5

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

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

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

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

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

Этот script добавит всю строку, если ее там нет, или просто заменит (используя 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. Я написал выше script на нескольких строках, чтобы сделать комментарии синтаксическими, но я использую его как однострочный в командной строке, который выглядит так:

i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi

Ответ 6

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%

Ответ 7

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

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

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

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

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

(Просто -escaping "$VAR" как \"$VAR\" приводит к выходной строке " -quoted.)


Примеры

$ 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 равен " -quoted перед передачей в sed (sed - это либо ' - или " -quoted):

$ 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!

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

Заключение

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

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

$ echo "$VAR"
apples and bananas

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

Ответ 8

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

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

Ответ 9

Может быть "\" char, попробуйте следующее:

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