【问题标题】:Replacing "." in a file unix替换“。”在文件中
【发布时间】:2015-07-31 12:54:51
【问题描述】:

我正在尝试替换文件中字符串中间出现的任何句点。

我尝试过使用's/./5/g' 以及's/'.'/5/g's/"."/5/g'sed,但它们都没有给我想要的输出。

第一个选项用单个 5 替换整个文件,第二个选项用 5 替换每个字符,第三个似乎没有做任何事情(我使用 grep 来计算 . 的出现次数,它们仍然存在)。

任何关于如何做到这一点的帮助将不胜感激

文件:

010001010.10101010101

需要输出文件:

010001010510101010101

【问题讨论】:

    标签: unix replace sed


    【解决方案1】:

    对于简单的转换,您可以使用 tr:

    cat file | tr "." "5"
    

    【讨论】:

      【解决方案2】:

      您遇到的问题是“。”也被用作通配符。你可以用 \ 转义它来解决这个问题,所以它就像s/\./5/g

      【讨论】:

        【解决方案3】:

        在点之前加反斜杠,因为它是特殊字符

        sed 's/\./5/g' file
        

        【讨论】:

          【解决方案4】:

          正则表达式模式. 表示“任何字符”。你要s/\./5/g

          【讨论】:

          • 或者s/[.]/5/g;对额外的非转义传递更加健壮(如果命令正在通过 ssh 或其他在执行前被处理的地方)。
          • echo 'a.b' | ssh localhost "sed 's/\./5/g'" 工作得很好。
          • @ikegami,是的,像这样正确引用,它会的。并非每个人都始终正确引用。考虑ssh localhost sed s/\./5/g - 它以ssh localhost sed s/[.]/5/g 不会失败的方式失败。 (由于其他原因没有引用不好的做法,但对于不遵循好的做法的人来说,重点是稳健性)
          • 当然,对于单个字符的全局替换,echo "a.b" | tr . 5可能更高效,而对于变量中的值,echo "${var//./5}"
          • 当有更稳健的替代方案可用时,我仍然不同意推广一种不太稳健的做法,但我自己在其他讨论中也使用了相同的推理,所以我没有多少空间可以谈论。好好的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-26
          • 2021-10-19
          • 1970-01-01
          • 2020-12-12
          • 2011-04-04
          • 2015-10-31
          • 1970-01-01
          相关资源
          最近更新 更多