Awk在模式匹配中打印下一个单词

Awk在模式匹配中打印下一个单词,awk,Awk,这是一个变化的主题印刷后的图案 将有带单词的输入行。一些行将匹配一个模式,其中模式将是一个或多个由空格分隔的单词。该模式可能有需要遵守的前导/尾随空格。我需要在比赛结束后立即打印单词 示例输入 The quick brown fox jumps over the lazy dog Pattern : "brown fox " Desired output : jumps 该模式在一行中只出现一次。总会有一个词遵循这个模式。会有没有图案的线条 awk或sed会很好 干杯 编

这是一个变化的主题印刷后的图案

将有带单词的输入行。一些行将匹配一个模式,其中模式将是一个或多个由空格分隔的单词。该模式可能有需要遵守的前导/尾随空格。我需要在比赛结束后立即打印单词

示例输入

The quick brown fox jumps over the lazy dog

Pattern : "brown fox "
Desired output : jumps
该模式在一行中只出现一次。总会有一个词遵循这个模式。会有没有图案的线条

awk或sed会很好

干杯

编辑:

我没有恰当地问这个问题。模式和下一个单词之间将有一个或多个空格。这打破了安德烈的提议

    % echo -e "The quick brown fox jumps over the lazy dog\n" | awk -F 'brown fox ' 'NF>1{ sub(/ .*/,"",$NF); print $NF }'
jumps
    % echo -e "The quick brown fox    jumps over the lazy dog\n" | awk -F 'brown fox ' 'NF>1{ sub(/ .*/,"",$NF); print $NF }'

如果所需的单词后面有一个空格,则此操作有效:

编辑: 如果有更多空间,请使用此选项:

$ awk -F 'brown fox' 'NF>1{ sub(/^ */,"",$NF);
                            sub(/ .*/,"",$NF); print $NF }' file
使用GNU grep:

$ grep -oP '(?<=brown fox )(\w+)' file
jumps

免责声明:此解决方案假设如果未找到任何图案(将有没有图案的线条)。打印空行是合适的,如果这不成立,则完全忽略此答案

我将使用
AWK
实现以下方式,让
file.txt
内容

The quick brown fox jumps over the lazy dog
No animals in this line
The quick brown fox   jumps over the lazy dog
然后

输出

jumps

jumps

说明:我将字段分隔符
FS
设置为
“brown fox”
,后跟任意数量的空格。这之后的内容将出现在第二列中,我从第二列中丢弃第一个空格之后的任何内容,包括所说的空格,然后打印该列。如果不匹配,则第二列为空,这些操作将导致空行。

对于GNU awk,您还可以使用带有函数的捕获组

  • \y
    单词边界
  • brown\s+
    匹配brown和1+空格字符
  • fox\s+
    匹配fox和1+空格字符
  • (\w+)
    组1中捕获1+个单词字符
在awk中,使用
arr[1]

范例

echo "The quick brown fox jumps over the lazy dog" |
awk 'match($0,/\ybrown\s+fox\s+(\w+)/, arr) {print arr[1]}'
输出

jumps

请参阅一个

不幸的是,模式和捕获词之间有多个空格。此错误已损坏。易于修复。我只测试了grep版本。没关系。(grep和perl的perl兼容模式可以是
\bbrown\h+fox\h+\K\w+
,无需查找)请阅读以了解它的重要性,然后在问题中出现的任何地方用“regexp”或“string”替换“pattern”,并添加关于如何处理部分匹配的信息(例如,
own fox
是否匹配
brown fox
?)。一旦您这样做,我们可以帮助您为您的问题找到正确的解决方案。
pat='brown fox'
awk -v pat="$pat" 'index($0, pat){
            split($0,arr, pat)
            split(arr[2], arr2)
            print arr2[1]}' file
The quick brown fox jumps over the lazy dog
No animals in this line
The quick brown fox   jumps over the lazy dog
awk 'BEGIN{FS="brown fox  *"}{sub(/ .*/,"",$2);print $2}' file.txt
jumps

jumps
\ybrown\s+fox\s+(\w+)
echo "The quick brown fox jumps over the lazy dog" |
awk 'match($0,/\ybrown\s+fox\s+(\w+)/, arr) {print arr[1]}'
jumps