从文件中替换$和#

时间:2014-02-24 17:05:48

标签: shell sed awk

我的文件包含以下评论:

\$max_servers = 2;    

\#\## BLOCKED ANYWHERE 

我正在尝试

  • \$的所有实例替换为$
  • \#\##的所有实例替换为###

我想知道如何通过sed或awk来做这件事

到目前为止,我使用vi或vim

取得了很大的成功
%s/^\//gc

%s/^#/\\/###/gc 

谢谢

5 个答案:

答案 0 :(得分:3)

在一次传递中替换所有[#$]的另一个选项是使用以下正则表达式。以下是VI语法:

:%s/\\\([$#]\)/\1/g

如果括号[]中的字符不仅仅是#$,还可以替换括号\\中的字符。

第一个\(是一个反斜杠 - 因为它在正则表达式中而被转义 保存\)\1之间的表达式,稍后将替换为{{1}}。

答案 1 :(得分:1)

使用反斜杠转义特殊字符。例如,要用\ $替换所有内容,你会这样做     %s/\\\$/$/g

答案 2 :(得分:1)

转义反斜杠可以正常工作

 #echo "\#\##"| sed "s/\\\\#\\\\##/###/g"
 ###
 # echo "\\$"| sed "s/\\\\\\$/$/g"
 $

答案 3 :(得分:1)

为了替换反斜杠,你必须加倍,所以它可以引用,就像引用其他特殊字符的方式一样。您可以使用sed代替vim来帮助自动完成此过程:

$ sed -e 's/^\\\$/$/' -e 's/^\\#\\##/###/' $file > $new_file

请注意,您必须在美元符号前加上反斜杠,因为它们用于标记正则表达式中的行尾。这就是为什么我的第一个表达式中有\\\$的原因。一个反斜杠引用反斜杠和另一个反斜杠来引用美元符号。

顺便说一句,这些相同的sed表达式也可以在Vim中运行,具体取决于你的Vim设置。

答案 4 :(得分:1)

sed 's|^\\\([$#]\)\\\{0,1\}|\1|' YourFile

您的样本广告的工作也将移除\中的\$\ ...