如何在 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'" 替换为 blased "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 表达式需要双引号 (") 才能正确解释变量。

https://askubuntu.com/questions/76808/how-do-i-use-variables-in-a-sed-command How to use variables in a command in 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 中转义斜杠和双引号和单引号?的主要内容,如果未能解决你的问题,请参考以下文章

在 sed/shell 中转义 < 和 >

如何在 Sybase 中转义单引号

关于js怎样替换反斜杠和单引号的问题

在osx bash中转义多层级联单引号和双引号

努力在 SQL 查询 C# QODBC 中转义单引号

在 shell 中的双引号字符串中转义反引号