awk 如何找到带括号的变量的匹配项?

Sla*_*.In 1 regex bash shell awk

我有一个文件,我想在其中通过方括号内some_file.txt找到匹配行(它必须完全匹配,因为某些单词可能会重复 - 就像下面的示例所示)。文档内容如下所示:namefoo

[foo](url)
[foo Foo](url)
[bar (Bar)](url)
[fizz buzz](url)
Run Code Online (Sandbox Code Playgroud)

我想出了以下内容,但是当您name用括号指定时它会中断。

[foo](url)
[foo Foo](url)
[bar (Bar)](url)
[fizz buzz](url)
Run Code Online (Sandbox Code Playgroud)

我试图像这样逃避括号name="bar \(Bar\)",但这没有帮助。

anu*_*ava 6

使用非正则表达式搜索使用index函数:

awk -v n='bar (Bar)' 'index($0, n) {print NR}' file
3

# be more precise and search with surrounding [ .. ]
awk -v n='bar (Bar)' 'index($0, "[" n "]") {print NR}' file
3
Run Code Online (Sandbox Code Playgroud)

index函数执行纯文本搜索,awk因此不需要任何特殊字符的转义。

使用所有搜索词:

for name in 'foo' 'foo Foo' 'bar (Bar)' 'fizz buzz'; do
   awk -v n="$name" 'index($0, "[" n "]") {print NR, n}' file
done

1 foo
2 foo Foo
3 bar (Bar)
4 fizz buzz
Run Code Online (Sandbox Code Playgroud)

  • 如果你真的想过度杀伤它,你可以这样做 `index($0,"[" n "]") == 1` (3认同)
  • @kvantour 恕我直言,这是必需的,而不是过度杀伤,因为 URL 可以包含方括号和圆括号,所以否则有可能出现错误匹配。 (2认同)