【问题标题】:How to truncate the first digit of a number?如何截断数字的第一位?
【发布时间】:2016-05-17 23:37:28
【问题描述】:

例如,我的文件有以下数据:

$ cat sample.txt 

19999119999,string1,dddddd
18888135790,string2,dddddd
15555555500,string3,dddddd

这是一个示例数据。我们如何才能从每行中只删除第一个数字?我的输出应该是:

$ cat output.txt
9999119999,string1,dddddd
8888135790,string2,dddddd
5555555500,string3,dddddd

有没有办法使用 grep 或 sed 来解析每一行字符? 或者任何其他方式来获得所需的输出?

【问题讨论】:

  • 这是一个简单的 sed 字符串:sed 's/^[0-9]//'
  • 所以删除行中的第一个字符,对吧?
  • 如果第一个字段中的数字是个位数的数字怎么办?该数字是否仍应删除,不留下任何数字?如果不是(因此您只想截断多位数字的第一个数字),那么您需要比sed 's/^[0-9]//' 更复杂一点——您需要sed 's/^[0-9]\([0-9]\)/\1/'(在行首查找两位数字)并仅替换第二个)。如果您确信第一个字段中永远不会有一位数,您可以使用原始的更简单的脚本 - 使用正则表达式通常是稳健性和简单性之间的平衡行为。

标签: sed grep


【解决方案1】:

您只需要从第二个字符开始打印:

$ cut -c2- file
9999119999,string1,dddddd
8888135790,string2,dddddd
5555555500,string3,dddddd

或者,使用sed,删除第一个字符:

$ sed 's/^.//' file
9999119999,string1,dddddd
8888135790,string2,dddddd
5555555500,string3,dddddd

【讨论】:

    【解决方案2】:

    试试这个:

    $ sed -r 's/^[0-9](.*)/\1/' sample.txt
    

    输出:

    9999119999,string1,dddddd
    8888135790,string2,dddddd
    5555555500,string3,dddddd
    
    • ^[0-9] - 每行的第一个数字
    • (.*) - 除第一个数字外的每一行的内容
    • \1 - 表示 (.*) 的内容

    对不起,我的英语不好。

    【讨论】:

    • 它会从数据中删除所有出现的 1 吗?你能解释一下你的脚本吗?
    • 更简单:sed 's/^[0-9]//' sample.txt。或者,如果第一个数字总是1,因为入侵者似乎在说:sed 's/^1//' sample.txt
    • @intruder - 我已经更新了我的答案,抱歉我的英语不好。
    【解决方案3】:

    Grep 可以通过向后看来解决这个问题。为此,您需要-P 选项:

    grep -Po '(?<=^\d)(.+)' file   
    

    或简写:

    grep -Po '^\d\K.+' file
    

    (?&lt;=^\d)/^\d\K 部分是匹配第一个数字的后面的样子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 2020-08-28
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多