测试文件的完整内容是否与正则表达式匹配的最佳方法是什么,例如
^[0-9]{9}$
即,只有 9 个数字,没有其他数字,没有换行符,也没有多组数字。
这是我不太喜欢的一种变体:
cat -vt curloutput.txt | tr "\n" " " | egrep "^[0-9]{9}$"
编辑
我使用这样的公认解决方案:
grep --perl-regex "(?m)(?<!.)^\d{9}$(?!.)"
使用 GNU grep。
此正则表达式匹配“由 9 位数字组成”,并且(?m)
在换行符之后/之前使插入符号和美元匹配,因此它可以防止多行:
(?m)(?<!.)^\d{9}$(?!.)
环绕主要匹配的环视确保匹配的行是文件中的唯一行 - 即文件中只有一行。
请参阅rubular 上的演示,了解将任何其他字符添加到 9 位输入文本,即使是单个换行符,将导致不匹配
测试行数是否为 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
如果您使用多字节字符,则会计算字符数)
假设您希望文件中没有换行符,首先检查文件大小,然后检查内容:
[[ $(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
awk 'END{if(NR == 1 && /^[0-9]{9}$/)print}' test.in
当且仅当恰好有一行并且它与模式匹配时,才会打印数字。
如果你只想要返回值grep -q
,你可以使用这个:
awk 'END{exit !(NR == 1 && /^[0-9]{9}$/)}' test.in
您可以使用纯测试 oneliner
[[ `cat $file` =~ ^[0-9]{9}$ ]] && exit 0 || exit 1