Bash 如何在sed中转义双引号和单引号?
据我所知,当你使用单引号时,里面的所有内容都被认为是文字。我想用它来代替我。但我还想找到一个有单引号或双引号的字符串 比如说,Bash 如何在sed中转义双引号和单引号?,bash,command-line,sed,Bash,Command Line,Sed,据我所知,当你使用单引号时,里面的所有内容都被认为是文字。我想用它来代替我。但我还想找到一个有单引号或双引号的字符串 比如说, sed -i 's/"http://www.fubar.com"/URL_FUBAR/g' 我想替换“http://www.fubar.com“用URL_FUBAR。sed应该如何识别我的//或双引号 谢谢你的帮助 编辑:我可以使用s/\'http\:\/\/www\.fubar\.\com\'/URL\u fubar/g 是否在单引号内转义字符?可能是“\”字符,请
sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'
我想替换“http://www.fubar.com“用URL_FUBAR。sed应该如何识别我的//或双引号
谢谢你的帮助
编辑:我可以使用s/\'http\:\/\/www\.fubar\.\com\'/URL\u fubar/g
是否在单引号内转义字符?可能是“\”字符,请尝试以下方法:
sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'
您需要使用\“for转义”字符(\转义以下字符
sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'
sed
中的s//
命令允许您使用其他字符而不是/
作为分隔符,如中所示
sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
或
双引号不是问题。要匹配单引号,请切换两种类型的引号。请注意,单引号字符串可能不包含单引号(甚至不包含转义引号)
如果
sed
要将点解释为文字点,而不是匹配任何一个字符的正则表达式模式,则需要对点进行转义。很难在单引号内转义单引号。请尝试以下方法:
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
我的问题是,我需要将
“
放在表达式之外,因为我在sed表达式本身中有一个动态变量。因此,实际的解决方案是由lenn jackman提出的,您将sed正则表达式中的”
替换为[\”]
因此,我的全部重头戏是:
RELEASE_VERSION="0.6.6"
sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml
这是:
#
是sed分隔符
正则表达式中的[\”]
=“
”
value=
\“tags/$RELEASE\u VERSION\”
=我的替换字符串,重要的是它只有\“
对于引号关于单个引号,请参阅下面用于将字符串替换为让我们
的代码:
命令:
echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
结果:
喂,我们走吧
在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
另外,我在多行上写出了上面的脚本,以使注释可解析,但我在命令行中将其用作一行,如下所示:
i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi
旁白:包含BASH变量的sed表达式需要双引号(
“
)-才能正确解释变量
sed -i "s/foo/bar ""$VARIABLE""/g" <file>
此处,$VAR在管道连接至sed之前被引用(sed被引用为'
-或”
-quoted):
与之相比:
$ 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”
-如果在sed表达式中使用这些变量(”
),请再次引用这些变量(sed表达式本身必须是“$VAR”
-引号,而不是”
-引号)”
sed -i "s%http://www.fubar.com%URL_FUBAR%g"
回答得很好,杜德,我有一个简单的问题。我该如何用单引号代替双引号。我的代码中有单引号或双引号的实例,我可以只运行这个命令两次,但单引号转义的语法是什么?单引号转义对我不起作用(mac上的bash),但使用不同的引号类型包装命令而不是被替换的引号确实有效。例如:
sed's/“/bla/g'
将替换为bla
或sed“s/'/bla/g”将`替换为bla
@rrr单个引号字符串不能包含嵌入的单个引号。更改外部引号(以及转义shell现在可能有兴趣解释的任何特殊字符)是解决此问题的一种方法。另一种方法是在继续使用单引号字符串的其余部分之前,先断开单引号字符串,并将该字符串与“'”
(双引号单引号)连接起来,如“you'”“‘最好这样做’
。提出随意猜测不是一个解决办法。你可以在评论中添加这样的猜测——或者更好——先尝试一下,在之前使用(反斜杠)。”(双引号)…和使用-i选项虽然此代码片段是受欢迎的,可能会提供一些帮助,但它将是如何解决问题的。如果没有这一点,您的答案的教育价值将大大降低-请记住,您回答的是未来读者的问题,而不仅仅是现在提问的人!请您的答案添加解释,并给出答案说明适用的限制和假设。有一种更简单的方法。尝试:echo“hello,let's go”| sed s/let's/let us/g
。您实际上不必在单引号中包含sed
的参数。
sed -i "s/foo/bar ""$VARIABLE""/g" <file>
$ 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!
$ 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!
$ VAR='apples and bananas'
$ echo "$VAR"
apples and bananas
$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!
sed -i "s%http://www.fubar.com%URL_FUBAR%g"