ChatGPT解决这个技术问题 Extra ChatGPT

如何在 sed 中转义斜杠和双引号和单引号?

据我所知,当您使用单引号时,里面的所有内容都被认为是文字。我想要那个来代替我。但我也想找到一个有单引号或双引号的字符串。

例如,

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 吗?

\ 实际上是否在单引号内转义字符?


K
Kusalananda

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'
T
TRiG

关于单引号,请参见下面用于将字符串 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 的参数。
g
goncalotomas

我的问题是我需要将 "" 放在表达式之外,因为我在 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\" = 我的替换字符串,重要的是它只有 \" 用于引号


g
glenn jackman

很难在单引号内转义单引号。尝试这个:

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

s
starry_eyed_sysadmin

在 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

PS 我在多行上编写了上面的脚本以使注释可解析,但我将其用作命令行上的单行代码,如下所示:

i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi

V
Victoria Stuart

另外:包含 BASH 变量的 sed 表达式需要双引号 (") 才能正确解释变量。

https://askubuntu.com/questions/76808/how-do-i-use-variables-in-a-sed-command

如何在 sed 的命令中使用变量?

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

Bash 变量,受数字文件和文件夹名称影响的命令

...然后您可以转义变量双引号,如下所示:

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")

"- 再次引用那些变量 (""$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!


S
SachinH
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 选项
虽然欢迎使用此代码段,并且可能会提供一些帮助,但它greatly improved if it included an explanation如何解决了这个问题。没有这个,你的回答就没有多大的教育价值了——记住你是在为未来的读者回答这个问题,而不仅仅是现在问的人!请edit您的回答以添加解释,并说明适用的限制和假设。
A
Andrey

您可以使用 %

sed -i "s%http://www.fubar.com%URL_FUBAR%g"

O
Odrai

最终对我有用的是使用 sed 的 HEX 选项来表示:

单引号:

echo "book'" |sed -n '/book[\x27]/p'

书'

双引号解决方案

cat testfile

“http://www.fubar.com”

sed -i 's|"http://www\.fubar\.com"|URL_FUBAR|g' testfile

cat testfile

URL_FUBAR


G
Guilhem Hoffmann

您需要使用 \" 转义 " 字符(\ 转义以下字符

sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'

P
Pang

可能是“\”字符,试试这个:

sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'

提出一个疯狂的猜测不是解决方案。您可以在评论中添加这样的猜测 - 甚至更好 - 先尝试一下