式と一致しないようなgrep出力ラインがなぜ発生するのですか?

式と一致しないようなgrep出力ラインがなぜ発生するのですか?

式と一致しないようなgrep出力ラインがなぜ発生するのですか?

で述べたように私のコメントこの動作はバグが原因で発生する可能性があります。

私は他のロケールが文字の順序に影響を与える可能性があることを知っていますが、以下の-o出力でこれが問題ではないことを確認したと思いましたが、私は間違っていました。 LC_ALL = Cを追加すると、予想される出力が得られます。

私は持っていますこの問題ロケールが出力に影響を与えるのを見た後。

[aa@bb grep-test]$ cat input.txt
aa bb
CC cc
dd ee

[aa@bb grep-test]$ LC_ALL=C grep -o [A-Z] input.txt
C
C
[aa@bb grep-test]$ grep -o [A-Z] input.txt
C
C
[aa@bb grep-test]$ LC_ALL=C grep [A-Z] input.txt
CC cc
[aa@bb grep-test]$ grep [A-Z] input.txt
aa bb
CC cc
dd ee
[aa@bb grep-test]$





[aa@bb tmp]$ cat test
aa bb
CC cc
dd ee

[aa@bb tmp]$ grep [A-Z] test
aa bb
CC cc
dd ee
[aa@bb tmp]$ grep -o [A-Z] test
C
C
[aa@bb tmp]$ grep -E [A-Z] test
aa bb
CC cc
dd ee
[aa@bb tmp]$ grep -n [A-Z] test
1:aa bb
2:CC cc
3:dd ee
[aa@bb tmp]$ echo [A-Z]
[A-Z]
[aa@bb tmp]$ grep -V
GNU grep 2.6.3
...
[aa@bb tmp]$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
...
[aa@bb grep-test]$ command -v grep
/bin/grep
[aa@bb grep-test]$ rpm -q -f $(command -v grep)
grep-2.6.3-6.el6.x86_64
[aa@bb grep-test]$ echo grep [A-Z] input.txt | xxd
0000000: 6772 6570 205b 412d 5a5d 2069 6e70 7574  grep [A-Z] input
0000010: 2e74 7874 0a                             .txt.    
[aa@bb grep-test]$ cmd='grep [A-Z] input.txt'; echo $cmd | xxd; eval $cmd
0000000: 6772 6570 205b 412d 5a5d 2069 6e70 7574  grep [A-Z] input
0000010: 2e74 7874 0a                             .txt.
aa bb
CC cc
dd ee
[aa@bb grep-test]$ xxd input.txt
0000000: 6161 2062 620a 4343 2063 630a 6464 2065  aa bb.CC cc.dd e
0000010: 650a 0a                                  e..
[aa@bb grep-test]$

答え1

あなたの「A」はラテン語「A」ではありません。

cmd='grep [A-Z] test'; echo $cmd | xxd; eval $cmd
0000000: 6772 6570 205b ***41***2d 5a5d 2074 6573 740a  grep [A-Z] test.
CC cc


cmd='grep [А-Z] test'; echo $cmd | xxd; eval $cmd
0000000: 6772 6570 205b ***d090*** 2d5a 5d20 7465 7374  grep [..-Z] test
0000010: 0a                                       .
aa bb
CC cc
dd ee

答え2

あなたのロケールコントラストが非常に役立つようです。

試してみてください

LC_ALL=C grep [A-Z] input.txt

このアイデアをテストするために。

私は持っています

export LANG=en_US.UTF-8
export LC_COLLATE=C
export LC_NUMERIC=C

Unicodeの利点を引き続き得ながら、この手間を避けるためにシェルを実行します。

答え3

BSDまたはGNUを使用してコピーすることはできませんgrep

BSD:

$ cat test
aa bb
CC cc
dd ee
$ grep [A-Z] test
CC cc
$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

牛に似た栄養の一種:

$ cat test
aa bb
CC cc
dd ee
$ grep [A-Z] test
CC cc
$ grep --version
grep (GNU grep) 2.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

関連情報