我想在linux中每行提取一个字符串的第一个实例。我目前正在尝试grep,但它会产生每行的所有实例。下面我想要" tn =" ...之后的字符串(数字和字母),但每行只需要第一组。实际字符可以是数字或字母的任意组合。他们之后还有一个空间。在tn =
之前还有一个空格给出以下文件:
hello my name is dog tn=12g3 fun 23k3 hello tn=1d3i9 cheese 234kd dks2 tn=6k4k ksk
1263 chairs are good tn=k38493kd cars run vroom it95958 tn=k22djd fair gold tn=293838 tounge
期望的输出:
12g3
k38493
答案 0 :(得分:2)
如果你有GNU grep,这是你可以做到的一种方法,它(大多数)支持与-P
的Perl兼容正则表达式。此外,非标准开关-o
仅用于打印与模式匹配的部分,而不是整行:
grep -Po '^.*?tn=\K\S+' file
模式匹配行^
的开头,后跟任何字符.*?
,其中?
使匹配非贪婪。在tn=
的第一场比赛后,\K
"杀死"上一部分,因此您只留下您感兴趣的位:一个或多个非空格字符\S+
。
与Ed's answer一样,您可能希望在tn
之前添加空格,以避免意外匹配footn=...
之类的内容。您可能还希望使用\w
之类的内容来匹配" word"字符(相当于[[:alnum:]_]
)。
答案 1 :(得分:0)
只需在tn=
- 分隔符中拆分输入,然后选择第二个。然后,再次拆分以获得第一个空间:
$ awk -F"tn=" '{split($2,a, " "); print a[1]}' file
12g3
k38493kd
答案 2 :(得分:0)
$ awk 'match($0,/ tn=[[:alnum:]]+/) {print substr($0,RSTART+4,RLENGTH-4)}' file
12g3
k38493kd