我试图在第 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