【问题标题】:Replace only 1 leading zero, if it's more than 1 times then discard it只替换1个前导零,如果超过1次则丢弃它
【发布时间】:2019-06-15 18:43:02
【问题描述】:

我不想用 @ 准确替换 1 个前导零,如果找到 2 个或更多前导零,则丢弃它。

0123
00123
000123
123

输出:

@123
00123
000123
123

我试过了

sed 's/^0.\{1\}/@/' file

注意:请考虑每行文件中的上述4条记录。

【问题讨论】:

  • sed '/^00/!s/^0/@/' file
  • 谢谢,上面的代码工作正常。

标签: regex shell unix sed sh


【解决方案1】:

您的正则表达式查找零,后跟任何字符。你想检查它后面没有跟零,但不要替换非零字符。

您可以捕获并放回您想要保留的角色:

sed 's/^0\([^0]\)/@\1/' file

或者您可以注意只替换与此正则表达式匹配的行上的第一个字符:

sed '/^0[^0]/s/^0/@/' file

与以往一样,指定某件事只重复一次是没有意义的,而且是多余的。

【讨论】:

  • 我这里还有一个问题,上面的列在文件中的第二个位置。表示数据看起来像 101|0123
  • 然后使用|0而不是^0(假设正好有两列)。您确实需要在问题中显示实际数据才能获得适合您数据的答案!
【解决方案2】:

awk 中的一个:

$ awk '{sub(/^0/,(/^00/?0:"@"))}1' file
@123
00123
000123
123

解释:

$ awk '{sub(/^0/,(/^00/?0:"@"))}1' file
        |    |       |  |  |
        |    |       |  |  otherwise with a @
        |    |       |  with a zero
        |    |       if followed by a zero
        |    leading zero
        replace

如果它在第二个 | 分隔字段中,请使用:

$ awk 'BEGIN{FS=OFS="|"}{sub(/^0/,($2~/^00/?0:"@"),$2)}1' file
1|@123|1
2|00123|2
3|000123|3
4|123|4

【讨论】:

    【解决方案3】:

    您应该在示例输入中的自己的行中包含一个 0,因为这是一个可能被遗漏的边缘情况:

    $ cat file
    0123
    00123
    000123
    123
    0
    
    $ sed -E 's/^0([^0]|$)/@\1/' file
    @123
    00123
    000123
    123
    @
    

    以上内容适用于任何具有-E 选项以使用 ERE 的 sed,例如GNU sed 和 BSD/OSX sed。

    【讨论】:

      【解决方案4】:

      使用 Perl

      $ cat lead_zero.txt
      0123
      00123
      000123
      123
      0
      $  perl -pe ' s/(^0)(?!0+.*)/@/ ' lead_zero.txt
      @123
      00123
      000123
      123
      @
      $
      

      如果它在管道分隔文件的第二列中,则使用它。

      $ cat lead_zero.txt2
      a|0123|x
      b|00123|y
      c|000123|xx
      d|00000123|yy
      e|123|zz
      f|0|qq
      $ perl -pe ' s/(.*?\|)0(?!0+.*)/$1@/ ' lead_zero.txt2
      a|@123|x
      b|00123|y
      c|000123|xx
      d|00000123|yy
      e|123|zz
      f|@|qq
      $
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        相关资源
        最近更新 更多