1

如何使用 grep 搜索从 1900 到 2100 的年份?

例如,如果我有一个变量,20123320我想打印2012

4

5 回答 5

2

使用 bash的有趣方式(sh用户小心!):

如果您想匹配并打印出现在文件行首的所有这些年份file

printf "^%s\n" {1900..2100} | grep -of - file

如果您有一个variable包含以下内容的变量20123320

variable=20123320
printf "^%s\n" {1900..2100} | grep -of - <(echo "$variable")

现在请详细说明您到底想做什么,以便我们给您最合适的答案。

编辑。以外的其他工具的其他答案时,这是一个 100% 的解决方案:

variable="20123320"
# take the first 4 characters of variable:
year="${variable:0:4}"
# check that year is an integer and that it falls into the given range
if [[ "$year" =~ ^[[:digit:]]+$ ]] && (( 1900<=year && year<=2100)); then
    echo "$year"
else
    # Do whatever you want here
    echo "You dumbo, I couldn't find a valid year in your string"
fi
于 2012-12-09T15:08:30.627 回答
2
awk 'BEGIN{FIELDWIDTHS="4 "}{if($1~/^[0-9]+$/&&$1>=1900&&$1<=2100)print $1}'    
于 2012-12-09T15:27:00.870 回答
1

尝试这样做:

echo "$var" | grep -Eo '\b(((19|20)[0-9][0-9])|2100)'

或者查看我的解决方案,因为我认为regex在这里使用不是最好的方法。

于 2012-12-09T15:00:26.623 回答
0

不是更好的工具,Perl 将更适合、更容易和更健壮地测试数字范围:

echo "$var" | perl -lne '
    $year = substr($_, 0, 4);
    print $year if $year <= 2100 && $year >= 1900 && $year =~ /^\d+$/
'

或与具有相同的逻辑:

echo "$var" | awk '
{
    year = substr($0, 0, 4)
    if (year <= 2100 && year >= 1900 && $1 ~ /^[0-9]+$/) {
        print year
    }
}'
于 2012-12-09T15:19:02.950 回答
0

如果你坚持使用grep这个,你可以。

我假设您要匹配一个以 1900 到 2100 范围内的 4 位数字开头的变量,并且您只想打印这 4 位数字。

echo "$var" | grep -Eo '^(((19|20)[0-9][0-9])|2100)'

这忽略了前 4 位数字后面可能出现的任何内容(因为我想不出一种方法来检查字符串的其余部分而不打印它)。

但这grep不是这项工作的明显工具,正则表达式也不是匹配一系列数字的最佳工具。例如,如果您需要匹配从 1950 到 2100 的数字,则正则表达式必须大不相同。

就个人而言,我会使用 Perl:

echo "$var" | perl -ne 'if (/^(\d{4})\d{4}$/ and $1 >= 1900 and $1 <= 2100) { print "$1\n" }'

这会检查是否$var恰好包含 8 个十进制数字。如果要检查它们是否构成有效日期,则需要更多代码。

您也可以在 awk 中相当干净地完成它,这可能会更快一些。

于 2012-12-09T15:23:46.880 回答