正则表达式,仅在shell中捕获字母数字字符串



尝试编写正则表达式以捕获给定的字母数字值,但它也捕获其他数值。什么是获得期望输出的正确方法?

代码
grep -Eo '([[[:alnum:]])w+' file > output
$ cat file
2022-04-29 08:45:11,754 [14] [Y23467] [546] This is a single line
2022-04-29 08:45:11,764 [15] [fpes] [547] This is a single line
2022-04-29 08:46:12,454 [143] [mwalkc] [548] This is a single line
2022-04-29 08:49:12,554 [143] [skhat2] [549] This is a single line
2022-04-29 09:40:13,852 [5] [narl12] [550] This is a single line
2022-04-29 09:45:14,754 [1426] [Y23467] [550] This is a single line

电流输出-

[14
[Y23467
[546
[15
[fpes
[547
[143
[mwalkc
[548
[143
[skhat2
[549
[5
[narl12
[550
[1426
[Y23467
[550

期望输出-

Y23467
fpes
mwalkc
skhat2
narl12
Y23467

解决方案1: 使用您显示的示例,请尝试以下awk代码。简单的解释是,用gsub函数代替第4个字段的[],再打印第4个字段。

awk '{gsub(/[|]/,"",$4);print $4}' Input_file


解决方案2:对于GNUgrep,请尝试以下解决方案。

grep -oP '^[0-9]{4}(-[0-9]{2}){2} [0-9]{2}(:[0-9]{2}){2},[0-9]{1,3} [[0-9]+] [K[^]]*' Input_file

解释:增加上述正则表达式在GNUgrep中使用的详细说明。

^[0-9]{4}(-[0-9]{2}){2}  ##From starting of value matching 4 digits followed by dash 2 digits combination of 2 times.
[0-9]{2}(:[0-9]{2}){2}  ##Matching space followed by 2 digits followed by : 2 digits combination of 2 times.
,[0-9]{1,3}              ##Matching comma followed by digits from 1 to 3 number.
[[0-9]+] [K         ##Matching space followed by [ digits(1 or more occurrences of digits) followed by space [ and
##then using K to forget all the previously matched values.
[^]]*                    ##Matching everything just before 1st occurrence of ] to get actual values.

使用[[:alnum:]]w表示它可能匹配字母数字或单词字符。

如果可以有数字,但应该有字符a-z,并且支持使用-P作为perl兼容的正则表达式:

grep -oP '[Kd*[A-Za-z][dA-Za-z]*(?=])' file

  • [匹配[
  • K忘记目前匹配的内容
  • d*[A-Za-z]匹配可选数字和至少一个字符a- za -z
  • [dA-Za-z]*匹配可选字符a-zA-Z和数字
  • (?=])断言]向右

输出
Y23467
fpes
mwalkc
skhat2
narl12
Y23467

如果只能出现一次,您也可以将sed与捕获组(...)一起使用,并使用1替换该组

sed 's/.*[([[:digit:]]*[[:alpha:]][[:alnum:]]*)].*/1/' file

你的问题有几个部分。首先,我将尝试帮助你与你的正则表达式(但它可能会解锁更多的问题);下面我将向您展示另一种选择。

Regex

关于[[:alnum:]]需要理解的是,它捕获任何包含字母数字字符的内容。它会捕获123abc"因为所有这些字符都是字母数字。它单独判断每个字符,不能捕获"只包含数字和字母的部分";喜欢你想要的。

然而,通过将几个grep链接在一起,我们可以过滤掉只包含数字的行。

grep -Eo '([[[:alnum:]])w+' file | grep -v -Eo '[[[:digit:]]+(w+|$)' > output

为了进一步完善这一点,您的正则表达式中似乎有几个错误。首先,您在捕获的部分中包含了[,这就是为什么它在结果中捕获[,所以您应该将([更改为[(,以将[移动到括号( ... )中捕获部分的外部。

接下来,[[:alnum:]]w+的组合可能没有达到预期的效果。它查找单个字母数字字符,后面跟着一个或多个"单词"。字符(包括所有的字母数字和一些额外的字符)。你可能需要([[:alnum:]]+)而不是([[:alnum:]])w+

为什么不用cut代替呢?cut -d' ' -f4将占据第4个字段(带"空格")。作为字段之间的分隔符)

$ cut -d' ' -f 4 file 
[Y23467]
[fpes]
[mwalkc]
[skhat2]
[narl12]
[Y23467]

如果您还想删除方括号,请尝试

$ cut -d' ' -f 4 file | grep -Eo 'w+'
Y23467
fpes
mwalkc
skhat2
narl12
Y23467

使用sed

$ sed 's/([^[]*[){2}([^]]*).*/2/' input_file
Y23467
fpes
mwalkc
skhat2
narl12
Y23467

使用FPAT与GNUawk:

awk -v FPAT='[[[:alnum:]]*]' '{gsub(/^[|]$/, "",$(NF-1));print $(NF-1)}' file
Y23467
fpes
mwalkc
skhat2
narl12
Y23467
  • FPAT设置为'[[[:alnum:]]*]',我们匹配[char后跟0或多个字母数字字符后跟]char。

  • gsub()函数去掉开头的[和最后的]字符。

  • 我们打印最后一个字段之前的字段,即$(NF-1)字段,不包含[]字符。

相关内容

  • 没有找到相关文章

最新更新