如何在 sed 中转义斜杠和双引号和单引号?
Posted
技术标签:
【中文标题】如何在 sed 中转义斜杠和双引号和单引号?【英文标题】:How do I escape slashes and double and single quotes in sed? 【发布时间】:2011-11-22 23:25:31 【问题描述】:据我所知,当你使用单引号时,里面的所有内容都被认为是文字。我想要那个来代替我。但我也想找到一个有单引号或双引号的字符串。
例如,
sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'
我想用 URL_FUBAR 替换“http://www.fubar.com”。 sed 应该如何识别我的 // 或我的双引号?
感谢您的帮助!
编辑:我可以使用s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g
吗?
\ 是否真的在单引号内转义字符?
【问题讨论】:
【参考方案1】:可能是“\”字符,试试这个:
sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'
【讨论】:
提出疯狂的猜测不是解决方案。你可以在 cmets 中添加这样的猜测——甚至更好——先尝试一下【参考方案2】:需要使用\"转义"字符(\转义后面的字符
sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'
【讨论】:
【参考方案3】:sed
中的s///
命令允许您使用其他字符而不是/
作为分隔符,如
sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
或
sed 's,"http://www\.fubar\.com",URL_FUBAR,g'
双引号不是问题。要匹配单引号,请切换两种类型的引号。请注意,单引号字符串可能不包含单引号(甚至不包含转义的引号)。
如果sed
要将它们解释为文字点而不是正则表达式模式.
匹配任何一个字符,则需要对这些点进行转义。
【讨论】:
很好的答案,我只是有一个简单的问题。我将如何用单引号代替双引号。我的代码中有单引号或双引号的实例,我可以运行此命令两次,但是转义单引号的语法是什么? 转义单引号对我不起作用(mac上的bash),但是使用不同的引号类型来包装命令而不是被替换的引号确实有效。例如:sed 's/"/bla/g'
将 "
替换为 bla
或 sed "s/'/bla/g" to replace
'` 替换为 bla
@rrr 单引号字符串不能包含嵌入的单引号。更改外引号(并转义 shell 现在可能有兴趣解释的任何特殊字符)是解决此问题的一种方法。另一种方法是跳出单引号字符串并将字符串与"'"
(双引号单引号)连接,然后继续使用单引号字符串的其余部分,如'you'"'"'d better do that'
。【参考方案4】:
单引号内的单引号很难转义。试试这个:
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
【讨论】:
【参考方案5】:我的问题是我需要在表达式之外有""
,因为我在 sed 表达式本身中有一个动态变量。因此,实际解决方案是来自 lenn jackman 的解决方案,您将 sed 正则表达式中的 "
替换为 [\"]
。
所以我完整的 bash 是:
RELEASE_VERSION="0.6.6"
sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml
这里是:
#
是 sed 分隔符
[\"]
= "
在正则表达式中
value = \"tags/$RELEASE_VERSION\"
= 我的替换字符串,重要的是它只有 \"
的引号
【讨论】:
【参考方案6】:关于单引号,请参见下面的代码,用于将字符串let's
替换为let us
:
命令:
echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
结果:
你好,我们走吧
【讨论】:
有一个 much 更简单的方法来做到这一点。试试:echo "hello, let's go" | sed s/let\'s/let us/g
。您实际上必须在单引号中包含sed
的参数。【参考方案7】:
在 sed 中转义双引号是绝对必要的:例如,如果您在整个 sed 表达式中使用双引号(当您想使用 shell 变量时需要这样做)。
这是一个涉及 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)
如果不存在,此脚本将添加整行,或者它会简单地用文本加上 $i 的值替换(使用 sed)存在的行。
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
附:我在多行上编写了上面的脚本以使 cmets 可解析,但我将它用作命令行上的单行代码,如下所示:
i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi
【讨论】:
【参考方案8】: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%
【讨论】:
只需在 "(双引号).. 之前使用 (反斜杠).. 并使用 -i 选项 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of 如何解决这个问题。没有这个,你的回答就没有多少教育价值了——记住你是在为未来的读者回答这个问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。【参考方案9】:另外:包含 BASH 变量的 sed 表达式需要双引号 ("
) 才能正确解释变量。
如果你也双引号你的 $BASH 变量(推荐做法)
Bash variables, commands affected by numeric-numbered file and folder names...然后你可以转义变量双引号,如图:
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!
...等等...
结论
作为标准做法,我的建议是
"
-quote BASH 变量 ("$VAR"
)
"
-quote,再次,如果在 sed 表达式中使用这些变量 (""$VAR""
)(它本身必须是 "
-quote,而不是 '
-quoted)李>
$ VAR='apples and bananas'
$ echo "$VAR"
apples and bananas
$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!
【讨论】:
【参考方案10】:你可以使用 %
sed -i "s%http://www.fubar.com%URL_FUBAR%g"
【讨论】:
以上是关于如何在 sed 中转义斜杠和双引号和单引号?的主要内容,如果未能解决你的问题,请参考以下文章