如何从bash中的一行获取名称?

时间:2017-11-06 17:12:09

标签: bash shell

我正在写一个接受某人id的脚本,脚本应该打印这个人的名字!现在我遇到的问题是名字不详!

在我现在的目录中我有一个文件,在这个文件中有行,每行的格式如下:

  

id_number(来自6位数)名称(可以是任意长度,最后可以包括数字)number_of_brothers(正数之间)   0-10)more_random数字(也是6位数字,但这是可选的   这意味着它可能不是这里的任何数字)

名称可以在末尾包含一个数字,也可以在名称后面包含一个类似于兄弟数量的数字,之后,它是可选的,该行包括兄弟数量后的id数字(而我说数字od包含6位数)     (也可能在行的开头有空格,每两个数字或名称之间至少有一个空格)     例如:

  

234218 Dan Simon 1 3 234122 234118 104134

(这里我想要的名字是“Dan simon 1”)

另一个例子:

  

236501克里斯·布朗歌手3

(我想要的名字是“克里斯·布朗歌手”)

我的问题是如何得到这个名字!因为这个名字可能包含很多单词和数字!

我开始删除行中的额外空格并完成grep以获取包含正确id的行

#!/bin/bash

line = `grep ^$1 names_file`
correct_line=`echo $line`

2 个答案:

答案 0 :(得分:1)

输入文件:

re='^[0-9]{6} +([a-zA-Z][a-zA-Z0-9 ]*) +[0-9]{1,2}( +[0-9]{6,})*$'

while IFS= read -r line; do [[ $line =~ $re ]] && echo "${BASH_REMATCH[1]}"; done < file

Dan simon 1
chris brown singer
John Right 2nd

这是纯粹的bash正则表达式解决方案:

gnu grep

使用grep -oP '^\d{6,}\s+\K[\w\s]+?(?=\s+\d{1,2}(?:\s+\d{6,})*$)' file Dan simon 1 chris brown singer John Right 2nd

^\d{6,}\s+

<强>详细信息:

  • \K:在开头
  • 匹配6位以上的数字后跟1 +空格
  • [\w\s]+?:重置比赛
  • (?=\s+\d{1,2}(?:\s+\d{6,})*$):匹配1个字或空格字符
  • {{1}}:预计确保我们的年龄为1或2位数

答案 1 :(得分:0)

以下是使用awk解析文件的方法

// Put
Bundle bundle = new Bundle();
bundle.putInt("key", MyEnum.TYPE_0.getCode());

// Get 
MyEnum myEnum = MyEnum.fromCode(bundle.getInt("key"));