如何使用 grep 搜索从 1900 到 2100 的年份?
例如,如果我有一个变量,20123320
我想打印2012
。
使用 bash的有趣方式(sh
用户小心!):
如果您想匹配并打印出现在文件行首的所有这些年份file
:
printf "^%s\n" {1900..2100} | grep -of - file
如果您有一个variable
包含以下内容的变量20123320
:
variable=20123320
printf "^%s\n" {1900..2100} | grep -of - <(echo "$variable")
现在请详细说明您到底想做什么,以便我们给您最合适的答案。
编辑。当我看到使用bash和grep以外的其他工具的其他答案时,这是一个 100% 的bash解决方案:
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
awk 'BEGIN{FIELDWIDTHS="4 "}{if($1~/^[0-9]+$/&&$1>=1900&&$1<=2100)print $1}'
grep不是更好的工具,Perl 将更适合、更容易和更健壮地测试数字范围:
echo "$var" | perl -lne '
$year = substr($_, 0, 4);
print $year if $year <= 2100 && $year >= 1900 && $year =~ /^\d+$/
'
或与awk具有相同的逻辑:
echo "$var" | awk '
{
year = substr($0, 0, 4)
if (year <= 2100 && year >= 1900 && $1 ~ /^[0-9]+$/) {
print year
}
}'
如果你坚持使用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 中相当干净地完成它,这可能会更快一些。