11

测试文件的完整内容是否与正则表达式匹配的最佳方法是什么,例如

^[0-9]{9}$

即,只有 9 个数字,没有其他数字,没有换行符,也没有多组数字。

这是我不太喜欢的一种变体:

cat -vt curloutput.txt | tr "\n" " " | egrep "^[0-9]{9}$"

编辑

我使用这样的公认解决方案:

grep --perl-regex "(?m)(?<!.)^\d{9}$(?!.)"

使用 GNU grep。

4

5 回答 5

6

此正则表达式匹配“由 9 位数字组成”,并且(?m)在换行符之后/之前使插入符号和美元匹配,因此它可以防止多行:

(?m)(?<!.)^\d{9}$(?!.)

环绕主要匹配的环视确保匹配的行是文件中的唯一行 - 即文件中只有一行。

请参阅rubular 上的演示,了解将任何其他字符添加到 9 位输入文本,即使是单个换行符,将导致不匹配

于 2013-06-05T10:06:06.303 回答
6

测试行数是否为 1,然后测试该行是否与正则表达式匹配:

test $(wc -l file.txt | cut -f 1 -d ' ') = 1 \
    && grep -Eq '^[0-9]{9}$' file.txt && echo "match"

分解命令,这就是正在发生的事情:

#get the linecount
wc -l file.txt | cut -f 1 -d ' '

# Check if there is a match in the file
# result will be return value of the program so it can be used 
# directly with the AND operator
grep -Eq '^[0-9]{9}$' file.txt

通过使用 wc 计算字节数,您可以更加严格:

test $(wc -c file.txt | cut -f 1 -d ' ') -eq 9 

如果需要,它将捕获尾随的换行符。(-m如果您使用多字节字符,则会计算字符数)

于 2013-06-05T10:11:08.573 回答
1

假设您希望文件中没有换行符,首先检查文件大小,然后检查内容:

[[ $(stat -c %s $f) -eq 9 && $(<$f) =~ ^[0-9]{9}$ ]] && echo y || echo n    

测试:

$ f=/etc/passwd
$ [[ $(stat -c %s $f) -eq 9 && $(<$f) =~ ^[0-9]{9}$ ]] && echo y || echo n
n

$ f=$(mktemp)
$ printf "123456789" >| $f
$ [[ $(stat -c %s $f) -eq 9 && $(<$f) =~ ^[0-9]{9}$ ]] && echo y || echo n
y
于 2013-06-05T13:08:15.810 回答
1
awk 'END{if(NR == 1 && /^[0-9]{9}$/)print}' test.in

当且仅当恰好有一行并且它与模式匹配时,才会打印数字。

如果你只想要返回值grep -q,你可以使用这个:

awk 'END{exit !(NR == 1 && /^[0-9]{9}$/)}' test.in
于 2013-06-05T14:58:52.480 回答
1

您可以使用纯测试 oneliner

[[ `cat $file` =~ ^[0-9]{9}$ ]] && exit 0 || exit 1
于 2013-06-06T20:25:31.570 回答