如何使用awk匹配独特的模式



我有一个名为"file.txt"的文本文件,内容类似

test:one
test_test:two
test_test_test:three

如果模式是test,那么预期输出应该是one,对于其他两行也是如此。

这就是我尝试过的。

pattern=test && awk '{split($0,i,":"); if (i[1] ~ /'"$pattern"'$/) print i[2]}'

该命令给出类似的输出

one
two
three

pattern=test_test && awk '{split($0,i,":"); if (i[1] ~ /'"$pattern"'$/) print i[2]}'

two
three

我如何才能匹配";测试";对于";测试";而不是">测试_test";等等

如何将唯一模式testtest匹配,而不与test_test匹配,依此类推。

不要使用正则表达式来比较值,只需使用等式:

awk -F: -v pat='test' '$1 == pat {print $2}' file
one
awk -F: -v pat='test_test' '$1 == pat {print $2}' file
two

如果你真的想使用regex,那么像这样使用锚点:

awk -F: -v pat='test' '$1 ~ "^" pat "$" {print $2}' file
one

如果您想使用正则表达式,您可以使用pattern动态创建它,并可以选择性地重复_和pattern,直到匹配:

如果它与字符串的开头匹配,则可以打印第二个字段。

awk -v pattern='test' -F: '
$0 ~ "^"pattern"(_"pattern")*:" {
print $2
}
' file

输出

one
two
three

或者,如果只匹配第一个下划线之前的部分也是可以的,则分割_上的字段1并打印字段2:

awk -v pattern='test' -F: ' {
split($1, a, "_")
if(a[1] == pattern) print $2
}' file

使用带有单词边界的GNUsed

$ sed -n '/<test>/s/[^:]*://p' input_file
one

相关内容

  • 没有找到相关文章

最新更新