1

grep を使用して 1900 年から 2100 年までの年を検索するにはどうすればよいですか?

たとえば、20123320印刷したい変数がある場合2012

4

5 に答える 5

2
awk 'BEGIN{FIELDWIDTHS="4 "}{if($1~/^[0-9]+$/&&$1>=1900&&$1<=2100)print $1}'    
于 2012-12-09T15:27:00.870 に答える
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 に答える
1

これをやってみてください:

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

または、ここで使用するのが最善の方法ではないと思うので、私のregex

于 2012-12-09T15:00:26.623 に答える
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 桁の 10 進数が含まれていることを確認します。それらが有効な日付であることを確認したい場合は、さらにコードが必要になります。

awk でかなりきれいに実行することもできますが、これは少し速いかもしれません。

于 2012-12-09T15:23:46.880 に答える
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 に答える