sed
中的 s///
命令允许您使用其他字符而不是 /
作为分隔符,如
sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
或者
sed 's,"http://www\.fubar\.com",URL_FUBAR,g'
双引号不是问题。要匹配单引号,请切换两种类型的引号。请注意,单引号字符串可能不包含单引号(甚至不包含转义的引号)。
如果 sed
要将它们解释为文字点而不是匹配任何一个字符的正则表达式模式 .
,则需要对这些点进行转义。
关于单引号,请参见下面用于将字符串 let's
替换为 let us
的代码:
命令:
echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
结果:
你好,我们走吧
echo "hello, let's go" | sed s/let\'s/let us/g
。您实际上必须在单引号中包含 sed
的参数。
我的问题是我需要将 ""
放在表达式之外,因为我在 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\"
= 我的替换字符串,重要的是它只有 \"
用于引号
很难在单引号内转义单引号。尝试这个:
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
在 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
另外:包含 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!
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%
您可以使用 %
sed -i "s%http://www.fubar.com%URL_FUBAR%g"
最终对我有用的是使用 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
您需要使用 \" 转义 " 字符(\ 转义以下字符
sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'
可能是“\”字符,试试这个:
sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'
sed 's/"/bla/g'
将"
替换为bla
或sed "s/'/bla/g" to replace
'` 替换为bla
"'"
(双引号单引号)连接,然后继续处理单引号字符串的其余部分,如'you'"'"'d better do that'
。