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