找到某个关键字旁边的所有数字

时间:2017-04-30 11:32:00

标签: bash text-parsing

我有一个文本文件。它包含一些文本。文本混合了字符串和数字。我想查找关键字旁边的所有数字。 例如(此处的关键字为day):

  

今天非常好 32 天。明天我和10位朋友一起吃3个披萨,下次我们将 50 天或 19

(对任何想知道的人来说句子都是纯粹的废话)。 我想提取数字 32 50 19

到目前为止,我是bash的新手,我可以从文件中读取内容并提取所有数字

echo $(grep -Eo '[0-9\]+' $i)

EDIT2: 关键字必须是一天。白天,傍晚是不允许的。抱歉误入歧途

4 个答案:

答案 0 :(得分:1)

如果grep支持PCRE(-P),例如支持GNU grep

grep -Po '\d+(?=\s+day\b)'
  • - o只获得匹配的部分

  • \d+匹配一个或多个数字

  • 零宽度正向前瞻(?=\s+day\b)匹配一个或多个空格,后跟字符串day,然后是字边界

示例:

% grep -Po '\d+(?=\s+day\b)' <<<"Today is really nice 32 day. Tomorrow I will eat 3 pizzas with 10 of my friends next time we will take 50 day or 19 day"
32
50
19

答案 1 :(得分:1)

在GNU awk中:

$ awk -v RS='[ \n]' '{if(p~/[0-9]+/&&/^day/)print p;p=$0}' file
32
50
19

答案 2 :(得分:1)

这里有一个没有GNU的grep扩展的选项:

grep -o '[0-9][0-9]* day\>' | awk '{print $1}'

但是如果你想使用perl正则表达式(这是GNU grep -P所做的那样),你可以随时使用perl:

perl -lne 'print $1 while /(\d+) day\b/g' foo.txt

答案 3 :(得分:-1)

对于纯粹的bash解决方案,这里有一个:

#! /bin/bash
while read -r -a arr; do
    for (( i = 0; i < $(( ${#arr[@]} - 1 )); i += 1 )); do
        word=${arr[i]}
        next_word=${arr[$(( i + 1 ))]}
        [[ $word =~ ^[-0-9]+$ ]] &&
        [[ $next_word == "day" || $next_word == "day"[[:punct:]] ]] && 
        echo "$word"
    done
done < "/your/input/file" #or "$1" or whatever

逐行读取文件,创建每行的数组。 然后按照它的长度 - 1迭代数组,并检查每个项目是否为数字,然后检查下一个单词是否为day,带有一些标点符号或没有标点符号。

跳过已知线条的简单优化留给读者练习。