11

ファイルの完全な内容が次のような正規表現と一致するかどうかをテストする最良の方法は何ですか?

^[0-9]{9}$

つまり、数字は 9 つだけで、他には何もありません。改行も、複数の数字のセットもありません。

これは、私があまり好きではないバリアントの 1 つです。

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

編集

私はこのように受け入れられた解決策を使用します:

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

GNU grep を使用します。

4

5 に答える 5

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 に答える