sed'当搜索模式中的$

时间:2016-06-02 13:46:38

标签: bash sed zsh

我有一个包含字符串&#34的文件;这个$ c $是单引号",创建如下:

 %echo "this \$c\$ is a single quote" > test3.txt
 %cat test3.txt
this $c$ is a single quote

我想用单引号替换字母c,但我也需要匹配$字符(以避免匹配其他字符' c')。我似乎无法做到这一点。

我试过

 %sed 's/$c$/$foo$/' test3.txt
this $c$ is a single quote
显然我需要逃避$。

 %sed 's/\$c\$/$foo$/' test3.txt
this $foo$ is a single quote

但是,当我试图把逃脱的'在替换文本中我得到了

 %sed 's/$c$/$\'$/' test3.txt
quote>

所以我需要使用其他一些引用方法。

 %sed "s/\$c\$/$'$/" test3.txt
this $c$ is a single quote

什么都没有被替换,所以让我们试着逃避$

 %sed "s/$c$/$'$/" test3.txt
this $c$ is a single quote$'$

这对我来说是意料之外的,所以让我们尝试只匹配c进行健全检查。

 %sed "s/c/'/" test3.txt
this $'$ is a single quote

我尝试了许多其他组合,但没有运气。我如何在sed

中执行此操作

4 个答案:

答案 0 :(得分:4)

这个怎么样?

!$ echo 'This is $c$ ceee' | sed s/\\\$c\\\$/\'/
This is ' ceee

我没有在引号中附上整个sed的命令,所以我需要单独转义每个反斜杠和每个美元(当然也包括引号)。

修改
正如Chris Lear指出的那样,我的替换字符串不包含任何美元。这是一个修复 - 请注意这些美元对sed没有特殊含义(它们不被解释为匹配的符号,它们只是要插入的普通字符)所以他们只能逃脱一次:

!$ echo 'This is $c$ ceee' | sed s/\\\$c\\\$/\\\$\'\\\$/
This is $'$ ceee

!$ echo 'This is $c$ ceee' | sed s/\\\$c\\\$/\$\'\$/
This is $'$ ceee

答案 1 :(得分:3)

如果你想引用sed命令,你需要做大量的逃避。 $是shell和sed模式的特殊字符。在shell中,它表示要扩展的变量名称的开头,在您的情况下为$c。致sed它意味着行的结束。要进行引用,您需要将其从两个中删除,以便您可以执行

 sed "s/\\\$c\\\$/\$'\$/" test3.txt

或者你可以混合你的引用样式来围绕$ expansions使用单引号和单引号附近的双引号,如

sed 's/\$c\$/$'"'"'$/' test3.txt

答案 2 :(得分:2)

您可以使用ansi c string

sed $'s/\$c\$/\'/' 

这允许$' s的单反斜杠转义。

More info here

如果您想保留$ s

sed $'s/\$c\$/$\'$/'

答案 3 :(得分:0)

试试这个:

sed -i -E "s/([$]c[$])/\'/g" sed.txt