我正在写一个接受某人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`
答案 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
:在开头[\w\s]+?
:重置比赛(?=\s+\d{1,2}(?:\s+\d{6,})*$)
:匹配1个字或空格字符答案 1 :(得分:0)
以下是使用awk解析文件的方法
// Put
Bundle bundle = new Bundle();
bundle.putInt("key", MyEnum.TYPE_0.getCode());
// Get
MyEnum myEnum = MyEnum.fromCode(bundle.getInt("key"));