在第 n 次匹配后打印行

DJ1*_*180 8 sed awk text-processing regular-expression

我希望在以下文件中显示第 4598 行。实际上,我想在第 n 次匹配后显示该行。在这种情况下,第 3 次出现之后的行<Car>。我该怎么做?

<Car>
10456
</Car>
<Car>
70192
</Car>
<Car>
4598
</Car>
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 10

awk -v n=3 '/<Car>/ && !--n {getline; print; exit}'
Run Code Online (Sandbox Code Playgroud)

或者:

awk '/<Car>/ && ++n == 3 {getline; print; exit}'
Run Code Online (Sandbox Code Playgroud)

将搜索模式作为变量传递:

var='<car>'
PATTERN="$var" awk -v n=3 '
  $0 ~ ENVIRON["PATTERN"] && ++n == 3 {getline; print; exit}'
Run Code Online (Sandbox Code Playgroud)

这里使用ENVIRON而不是-v作为-v扩展反斜杠转义序列和反斜杠经常在正则表达式中找到(所以需要加倍-v)。

GNU awk4.2 或更高版本允许您将变量分配为强类型正则表达式。只要未启用其 POSIX 模式(例如通过$POSIXLY_CORRECT环境变量,您可以执行以下操作:

# GNU awk 4.2 or above only, when not in POSIX mode
gawk -v n=3 -v pattern="@/$var/" '
  $0 ~ pattern && ++n == 3 {getline; print; exit}'
Run Code Online (Sandbox Code Playgroud)