[[:digit:]]
文字クラスの複数の数字に一致するには+
、 を追加します。これは、 の 1 つ以上の数字に一致することを意味し$1
ます。
echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]+)$/) print $0}'
123456789012345,3
これはあなたの要件を満たしています。
より慣用的な方法(コメントから示唆されているように)は、をドロップprint
し、行に直接一致して印刷することです。
echo "123456789012345,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
123456789012345,3
同じことを示すいくつかの例、
echo "a1,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
(と)
echo "aa,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
要件ごとに出力を生成しないでください。
POSIX
数字の厳密な長さチェックを行う別の準拠した方法は、以下のようなもので実現できます。ここで{3}
、 は一致する長さを示します。
echo "123,3" | awk --posix -F, '$1 ~ /^[0-9]{3}$/'
123,3
(と)
echo "12,3" | awk --posix -F, '$1 ~ /^[0-9]{3}$/'
出力を生成しません。
比較的新しいバージョンのbash
シェルを使用している場合、上記のように文字クラスを使用してネイティブregEx
演算子をサポートしています。~
POSIX
#!/bin/bash
while IFS=',' read -r row1 row2
do
[[ $row1 =~ ^([[:digit:]]+)$ ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
入力ファイルの場合file
$ cat file
122,12
a1,22
aa,12
スクリプトは、
$ bash script.sh
122,12
これは機能しbash regEx
ますが、文字列操作を使用した比較的簡単な方法は遅くなる可能性があります
while IFS=',' read -r row1 row2
do
[[ -z "${row1//[0-9]/}" ]] && printf "%s,%s\n" "$row1" "$row2"
done < file
"${row1//[0-9]/}"
は行からすべての数字を削除し、変数に他の文字が残っていない場合にのみ条件が true になります。