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表达式需要双引号(
)-才能正确解释变量

如果还双引号引用$BASH变量(推荐做法)

…然后可以对变量双引号进行转义,如图所示:

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表达式中使用这些变量(
    “$VAR”
    ),请再次引用这些变量(sed表达式本身必须是
    -引号,而不是
    -引号)
你可以使用%

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"