我有一个包含字符串&#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
?
答案 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的单反斜杠转义。
如果您想保留$
s
sed $'s/\$c\$/$\'$/'
答案 3 :(得分:0)
试试这个:
sed -i -E "s/([$]c[$])/\'/g" sed.txt