Чтобы сопоставить несколько цифр в классе символов [[:digit:]]
, добавьте +
, что означает соответствие одной или нескольким цифрам в $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
с классами символов ~
using 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]/}"
удаляет все цифры из строки, и условие становится истинным только в том случае, если в переменной не осталось других символов.
person
Inian
schedule
23.12.2016