我有一个文本文件。它包含一些文本。文本混合了字符串和数字。我想查找关键字旁边的所有数字。
例如(此处的关键字为day
):
今天非常好 32 天。明天我和10位朋友一起吃3个披萨,下次我们将 50 天或 19 天
(对任何想知道的人来说句子都是纯粹的废话)。 我想提取数字 32 , 50 和 19 。
到目前为止,我是bash的新手,我可以从文件中读取内容并提取所有数字
echo $(grep -Eo '[0-9\]+' $i)
EDIT2: 关键字必须是一天。白天,傍晚是不允许的。抱歉误入歧途
答案 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
,带有一些标点符号或没有标点符号。
跳过已知线条的简单优化留给读者练习。