【问题标题】:Replacing quote marks around strings in Vim?在Vim中替换字符串周围的引号?
【发布时间】:2010-01-20 17:53:41
【问题描述】:

我有类似于<Foobar Name='Hello There'/> 的东西,需要将单引号更改为双引号。我尝试了:s/\'.*\'/\"\0\",但最终产生了<Foobar Name="'Hello There'"/>。将\0 替换为\1 只会在双引号内产生一个空白字符串 - 我是否缺少一些特殊语法,我只需要在引号内将找到的字符串(“Hello There”)分配给@ 987654326@?

【问题讨论】:

    标签: vim vi replace surround


    【解决方案1】:

    还有surround.vim,如果你想经常这样做的话。您可以使用 cs'" 更改周围的引号。

    【讨论】:

    • 有没有办法将它映射到一些领导命令?我做不到:\
    • 您不需要将其映射到领导命令,因为它使用带有两个参数的自定义 cs 运动 - ' 作为目标," 作为替代。
    【解决方案2】:

    你需要使用分组:

    :s/\'\(.*\)\'/\"\1\"
    

    这样,参数 1(即 \1)将对应于由 \( 和 \) 分隔的任何内容。

    【讨论】:

      【解决方案3】:

      %s/'\([^']*\)'/"\1"/g

      否则您将需要使用[^']* 而不是.*

      'apples' are 'red' 将转换为 "apples' are 'red"

      【讨论】:

      • 或使用.\{-} 代替.*。见:help /\{-
      【解决方案4】:

      除非我错过了什么,否则s/\'/"/g 不工作吗?

      【讨论】:

      • 这是我的妥协,但我觉得不太正确,尤其是如果属性内有单引号。我认为这不会发生在 XML 中,但它可能会发生在其他需要相同解决方案的情况下。
      • 单引号属性内的单引号应为',双引号属性内的双引号应为"。当然,单引号可能存在​​于双引号属性中,反之亦然...
      【解决方案5】:

      仅供参考 - 用单引号替换所有双引号,这是正确的正则表达式 - 基于上面 rayd09 的示例

      :%s/"\([^"]*\)"/'\1'/g
      

      【讨论】:

        【解决方案6】:

        您需要在要捕获的表达式部分周围加上圆括号。

        s/\'\(.*\)\'/"\1"/
        

        但是,您可能会遇到无意匹配的问题。您是否可以简单地将文件中的任何单引号替换为双引号?

        【讨论】:

          【解决方案7】:

          您的想法是正确的——您希望将"\1" 作为您的替换子句,但您需要首先将“Hello There”部分放在捕获组 1 中(0 是整个匹配项)。试试:

          :%/'\(.*\)'/"\1"

          【讨论】:

            【解决方案8】:

            假设您想对整个文件执行此操作...

            N模式:

            ggvG$ [SHIFT+:]  
            

            X 模式:

            '<,'>/'/" [RET]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-11-01
              • 1970-01-01
              • 1970-01-01
              • 2019-11-02
              • 2011-04-28
              • 1970-01-01
              • 2016-03-01
              • 1970-01-01
              相关资源
              最近更新 更多