【问题标题】:Reading numbers from a text line in bash shell从 bash shell 中的文本行读取数字
【发布时间】:2014-10-27 15:27:32
【问题描述】:

我正在尝试编写一个 bash shell 脚本,它会打开某个文件 CATALOG.dat,其中包含以下行,由字符和数字组成:

event_0133_pk.gz
event_0291_pk.gz
event_0298_pk.gz
event_0356_pk.gz
event_0501_pk.gz

我想做的是在一个新文件NUMBERS.dat 中打印数字(仅数字),使用类似> ./NUMBERS.dat 的东西来获取:

0133
0291
0298
0356
0501

我的问题是:如何从文本行中提取数字?有什么东西可以让脚本只读取数字作为变量,比如 C/C++ 中的event_0%d_pk.gz

【问题讨论】:

标签: bash shell awk sed grep


【解决方案1】:

grep 解决方案:

grep -oP '[0-9]+' CATALOG.dat >NUMBERS.dat

sed 解决方案:

sed 's/[^0-9]//g' CATALOG.dat >NUMBERS.dat

还有一个awk 解决方案:

awk -F"[^0-9]+" '{print $2}' CATALOG.dat >NUMBERS.dat

【讨论】:

  • 如果你使用 Perl 风格的正则表达式,你不妨使用\d 而不是[0-9]
  • 非常感谢,这正是我想要的! :) 如果我需要启动一个进程,每当每行中包含的数字在 200 到 300 之间时,我该怎么做?
  • @urgeo 我建议你单独提出一个问题。
【解决方案2】:

有很多方法可以实现您的结果。一种方法是使用 awk:

awk -F_ '{print $2}' CATALOG.dat > NUMBERS.dat

这会将字段分隔符设置为下划线,然后打印包含数字的第二个字段。

【讨论】:

    【解决方案3】:

    Awk

    awk 'gsub(/[^[:digit:]]/,"")' infile 
    

    重击

    while read line; do echo ${line//[!0-9]}; done < infile
    

    tr

    tr -cd '[[:digit:]\n]' <infile
    

    【讨论】:

      【解决方案4】:

      您可以使用grep 命令提取数字部分。

      grep -oP '(?<=_)\d+(?=_)' CATALOG.dat
      

      输出为

      0133
      0291
      0298
      0356
      0501
      

      或者

      很简单

      grep -oP '\d+' CATALOG.dat
      

      【讨论】:

        【解决方案5】:

        你不需要在 grep 中使用 perl 模式。 BRE 可以做到这一点。

        grep -o '[[:digit:]]\+' CATALOG.dat > NUMBERS.dat
        

        【讨论】:

          猜你喜欢
          • 2014-12-23
          • 1970-01-01
          • 1970-01-01
          • 2014-02-24
          • 2011-06-26
          • 2019-07-26
          • 1970-01-01
          • 2011-12-18
          • 1970-01-01
          相关资源
          最近更新 更多