【问题标题】:replacing $ and # from file从文件中替换 $ 和 #
【发布时间】:2014-02-24 17:05:48
【问题描述】:

我有这样的 cmets 文件:

\$max_servers = 2;    

\#\## BLOCKED ANYWHERE 

我正在尝试

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

我想知道如何通过 sed 或 awk 来做到这一点

到目前为止,我使用 vi 或 vim 的尝试都没有成功

%s/^\//gc

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

谢谢

【问题讨论】:

    标签: shell sed awk


    【解决方案1】:

    一次性替换所有 [#$] 的另一种方法是使用以下正则表达式。以下是VI语法:

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

    如果不只是#$,请将括号[] 中的字符替换为您需要的任何字符。

    第一个 \\ 是一个反斜杠 - 因为它在正则表达式中所以被转义了 \(\) 之间的表达式被保存,稍后在替换中用作 \1

    【讨论】:

      【解决方案2】:

      转义反斜杠会起作用

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

      【讨论】:

        【解决方案3】:

        为了替换一个反斜杠,你必须把它加倍,所以它可以引用自己,就像其他特殊字符必须被引用一样。您可以使用sed 而不是vim 来帮助自动化该过程:

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

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

        顺便说一下,这些相同的 sed 表达式也可以在 Vim 中工作,具体取决于您的 Vim 设置。

        【讨论】:

          【解决方案4】:

          您使用反斜杠转义特殊字符。因此,例如,用 \$ 替换所有内容,您可以这样做 %s/\\\$/$/g

          【讨论】:

          • 你不需要在替换中转义$
          • 好的,我现在修好了。
          【解决方案5】:
          sed 's|^\\\([$#]\)\\\{0,1\}|\1|' YourFile
          

          为您的示例 bu 工作还将删除 \$\ ... 中的 2 个 \

          【讨论】:

            猜你喜欢
            • 2017-01-10
            • 2021-11-06
            • 2021-10-19
            • 2018-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-16
            • 1970-01-01
            相关资源
            最近更新 更多