grep を使用して 1900 年から 2100 年までの年を検索するにはどうすればよいですか?
たとえば、20123320
印刷したい変数がある場合2012
。
awk 'BEGIN{FIELDWIDTHS="4 "}{if($1~/^[0-9]+$/&&$1>=1900&&$1<=2100)print $1}'
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
これをやってみてください:
echo "$var" | grep -Eo '\b(((19|20)[0-9][0-9])|2100)'
または、ここで使用するのが最善の方法ではないと思うので、私のperlソリューションを参照してください。regex
これに使用することを主張する場合は、使用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 でかなりきれいに実行することもできますが、これは少し速いかもしれません。
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
}
}'