Как мне избежать двойных и одинарных кавычек в 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
?
Выполняет ли\избегать символов внутри одиночных кавычек?
Ответы
Ответ 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'