如何提取包含特定单词的括号之间的文本?

Tux*_*ife 4 command-line text-processing

我该如何转换:

foo (blah) (bar 80)
foo (cats) (blat 92)
Run Code Online (Sandbox Code Playgroud)

对此:

foo bar 80
foo blat 92
Run Code Online (Sandbox Code Playgroud)

我想保留所有不在括号中的文本。

我只想提取括号之间包含字符串“bar”或“blat”的文本。

不包含“blat”或“bar”的括号对应该被忽略。

sed 或 awk 会更受欢迎

kos*_*kos 5

使用sed

< inputfile sed 's/(\([^\)]*\(bar\|blat\)[^\)]*\))/\1/g; s/(.*) //g'
Run Code Online (Sandbox Code Playgroud)

输入文件:

test (bar) (blat)
bar (testblat) (bartest)
blat (testbar) (barblat) (no) (blatanother)
Run Code Online (Sandbox Code Playgroud)

输出文件:

test bar blat
bar testblat bartest
blat testbar barblat blatanother
Run Code Online (Sandbox Code Playgroud)

细分

#1:

  • (: 匹配一个(字符
  • \(: 开始对捕获组进行分组
  • [^\)]*: 不匹配 0 个或多个字符 )
  • \(: 开始对允许的字符串进行分组
  • bar: 匹配第一个允许的字符串
  • \|: 分隔第二个允许的字符串
  • blat: 匹配第二个允许的字符串
  • \): 停止对允许的字符串进行分组
  • [^\)]*: 不匹配 0 个或多个字符 )
  • \): 停止对捕获组进行分组
  • ): 匹配一个)字符

#2:

  • (: 匹配一个(字符
  • .*: 匹配 0 个或多个字符
  • ): 匹配一个)字符
  • : 匹配一个字符