正则表达式匹配bash中文件的全部内容

时间:2013-06-05 09:56:16

标签: regex bash

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

^[0-9]{9}$

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

以下是我不喜欢的一种变体:

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

修改

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

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

使用GNU grep。

5 个答案:

答案 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