【发布时间】:2014-02-24 17:05:48
【问题描述】:
我有这样的 cmets 文件:
\$max_servers = 2;
\#\## BLOCKED ANYWHERE
我正在尝试
- 将所有
\$实例替换为$。 - 将所有
\#\##实例替换为###。
我想知道如何通过 sed 或 awk 来做到这一点
到目前为止,我使用 vi 或 vim 的尝试都没有成功
%s/^\//gc
%s/^#/\\/###/gc
谢谢
【问题讨论】:
我有这样的 cmets 文件:
\$max_servers = 2;
\#\## BLOCKED ANYWHERE
我正在尝试
\$ 实例替换为$。\#\## 实例替换为###。我想知道如何通过 sed 或 awk 来做到这一点
到目前为止,我使用 vi 或 vim 的尝试都没有成功
%s/^\//gc
%s/^#/\\/###/gc
谢谢
【问题讨论】:
一次性替换所有 [#$] 的另一种方法是使用以下正则表达式。以下是VI语法:
:%s/\\\([$#]\)/\1/g
如果不只是# 和$,请将括号[] 中的字符替换为您需要的任何字符。
第一个 \\ 是一个反斜杠 - 因为它在正则表达式中所以被转义了
\( 和 \) 之间的表达式被保存,稍后在替换中用作 \1。
【讨论】:
转义反斜杠会起作用
#echo "\#\##"| sed "s/\\\\#\\\\##/###/g"
###
# echo "\\$"| sed "s/\\\\\\$/$/g"
$
【讨论】:
为了替换一个反斜杠,你必须把它加倍,所以它可以引用自己,就像其他特殊字符必须被引用一样。您可以使用sed 而不是vim 来帮助自动化该过程:
$ sed -e 's/^\\\$/$/' -e 's/^\\#\\##/###/' $file > $new_file
请注意,您必须在美元符号前放置一个反斜杠,因为它们用于在正则表达式中标记行尾。这就是为什么我的第一个表达式中有\\\$。一个反斜杠引用反斜杠,另一个反斜杠引用美元符号。
顺便说一下,这些相同的 sed 表达式也可以在 Vim 中工作,具体取决于您的 Vim 设置。
【讨论】:
您使用反斜杠转义特殊字符。因此,例如,用 \$ 替换所有内容,您可以这样做
%s/\\\$/$/g
【讨论】:
$。
sed 's|^\\\([$#]\)\\\{0,1\}|\1|' YourFile
为您的示例 bu 工作还将删除 \$\ ... 中的 2 个 \,
【讨论】: