如何使用正则表达式匹配一行中第 N 个字段的字符串?

如何使用正则表达式匹配一行中第 N 个字段的字符串?

我试图在第 15 个单词的每一行上匹配字符串“RAV”。每个单词均由“|”分隔(管道)。我需要比较该行是否有这个字符串。如果是,我将继续下一步。

我正在尝试这个

((((?:[^|]*\|){17}(.*?)\|)+\|[^|]*$)|[^|]+(?=(\,\H\,))|(^([0-9]){4})|(([RAV]){3}))

但即使我有“RAV”第一、第二或任何其他字段,这个也匹配。我需要在第 15 场精确匹配。

答案1

您不一定会使用正则表达式。

awk

awk -F '|' '$15 == "RAV" { print }' myfile

这将打印文件中myfile第 15 个|分隔字段恰好是 string 的每一行RAV。这使用字符串比较,而不是正则表达式匹配。

RAV作为第 15 个字段中任意位置的子字符串进行匹配,请使用

awk -F '|' '$15 ~ /RAV/ { print }' myfile

这用作RAV扩展正则表达式并将其与第 15 个分隔字段中的数据进行匹配|。如果存在匹配,则打印当前行。

如果这是用调用起来很麻烦的语言编写的某些脚本或程序的一部分awk(即除了 shell 脚本之外的任何内容),则在分隔符上拆分字符串|并挑选第 15 个元素并进行比较。

用作awk伪代码语言,可能看起来像

nf = split($0, a, "|")
if (nf < 15)
    print "Not enough fields!" >"/dev/stderr"
else {
    if (a[15] == "RAV") print
}

或者,在 Perl 中(这次没有错误检查),

my @a = split /\|/, $string;
if ($a[15] eq "RAV") {
    print $string
}

在上面的每个变体中(包括初始awk命令),print代表确定第 15 个字段匹配后需要对数据执行的任何操作RAV

答案2

grep -E '^([^|]*\|){14}[^|]*RAV' infile
  • (...)称为小组赛;
  • {N}称为固定间隔量词;
  • (...){N}匹配小组赛 N 次。

答案3

您可以使用正则表达式,但是,呃。是的。关于那个。您可能想用awk类似的方法进行字段分割。你能明白为什么吗?

$ cat input
ok|x|x|x|x|x|x|x|x|x|x|x|x|x|RAV
ok|x|x|x|x|x|x|x|x|x|x|x|x|x|RAV|bar
bad|x|x|x|x|x|x|x|x|x|x|x|x|x|NOPE
bad|x|x|x|x|x|x|x|x|x|x|x|x|x|NOPE|bar
$ sed -E -n '/^[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|RAV(\||$)/p' input
ok|x|x|x|x|x|x|x|x|x|x|x|x|x|RAV
ok|x|x|x|x|x|x|x|x|x|x|x|x|x|RAV|bar

[^|]*\|表单基本上意味着“匹配一个字段”,假设|字段内永远无法转义,并且会重复(我曾经vi通过 键入它14i)十四次,然后处理第 15 个字段。非常恶心而且难以维护。

用PSawk代替。

答案4

使用 Raku(以前称为 Perl_6)

raku -ne '.put if / ^ [ .+ ]**14 % "|" RAV /;' 

上面的答案很好,但是 Raku 有新的、漂亮的%%%修改过的量词,这大大简化了这类问题。根据文档:%“为了更轻松地匹配逗号分隔值等内容,您可以在上述任何量词上添加修饰符,以指定每个匹配之间必须出现的分隔符。”修改后的量词%%允许使用尾随分隔符,例如尾随逗号。

上面带有原子的代码[ .+ ]要求每一列都有一个或多个字符(包括空格)。这可以更改为[ \S+ ](一个或多个非空白字符),甚至[ .* ](零个或多个字符)。

另外,与其他答案类似,您可以通过在|垂直条上拆分来解决此问题:

raku -ne '.put if .split("|")[14] eq "RAV" // next;'  

#OR

raku -ne '.split("|")[14] eq "RAV" ?? $_.put !! next;'  

输入示例(感谢@thrig):

ok|x|x|x|x|x|x|x|x|x|x|x|x|x|RAV
ok|x|x|x|x|x|x|x|x|x|x|x|x|x|RAV|bar
bad|x|x|x|x|x|x|x|x|x|x|x|x|x|NOPE
bad|x|x|x|x|x|x|x|x|x|x|x|x|x|NOPE|bar

示例输出:

ok|x|x|x|x|x|x|x|x|x|x|x|x|x|RAV
ok|x|x|x|x|x|x|x|x|x|x|x|x|x|RAV|bar

https://raku.org

相关内容