我有一个名为"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";等等
如何将唯一模式
test
与test
匹配,而不与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