9

Mac をお持ちの場合は、次の手順を試してください。

echo 'abcd*' > grepfile
echo 'abc$' >> grepfile
echo '^abc' >> grepfile
echo "fojeiwuroiuwet\nljfajsljkfabcdddjlfkajlkj\nabcaaa\nzzzabc\n" | grep -f grepfile

バージョンは次のとおりです。

$ grep --v
grep (BSD grep) 2.5.1-FreeBSD

これは、Apple のソフトウェア アップデートに対応しているマシン (2012 フレーバーの rMBP) であるため、10.8.4 を使用しています。

ソースからコンパイルされた GNUgrepではこの問題が発生しないことを確認しました。実際、それはバージョン 2.14 であり、2.5.1 よりも多くのバージョンです。

しかし、正規表現ごとに grep をフォークする非常に非効率的なループを使用せずに、一連の正規表現に対して入力をテストするタスクをどのように達成できるでしょうか?

編集:これを回避するために私が取ったアプローチは、次のようなものでした: while read REGEX; do [[ ... =~ $REGEX ]] ... done < regexfile.

質問: これは、このバージョンの grep の既知のバグですか? grep する正規表現のファイルで適切に動作するようにシステムを設定するにはどうすればよいでしょうか?

更新: 正常に動作すると報告している人もいるようです (この特定の FreeBSD 2.5.1 grep でも)。どの .so/.dylib を使用している可能性があるかを把握するために実行できる手順は何ですか? 誰かがやってshasum /usr/bin/grep、それがあなたのために働くかどうか教えてもらえますか? (それが多くの情報を提供するかどうかはわかりませんが、私が求めているのは、私のコンピューターの構成が台無しになっているかどうか、またはこれがこのバージョンのソフトウェアに実際に存在する問題であるかどうかです。)

$ shasum /usr/bin/grep
eac59389d09642decbb8551e2c975f795934bfbf  /usr/bin/grep

詳細は次のとおりです。

$ codesign -dvvv /usr/bin/grep
Executable=/usr/bin/grep
Identifier=com.apple.zgrep
Format=Mach-O thin (x86_64)
CodeDirectory v=20100 size=224 flags=0x0(none) hashes=6+2 location=embedded
Hash type=sha1 size=20
CDHash=93b823c000188f8737653d8333c90a6db9361d70
Signature size=4064
Authority=Software Signing
Authority=Apple Code Signing Certification Authority
Authority=Apple Root CA
Info.plist=not bound
Sealed Resources=none
Internal requirements count=2 size=208

さらなる調査:

$ gdb /usr/bin/grep
GNU gdb 6.3.50-20050815 (Apple version gdb-1824) (Thu Nov 15 10:42:43 UTC 2012)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .... done

(gdb) start -f grepfile
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n])
Starting program: /usr/bin/grep -f grepfile
Reading symbols for shared libraries +++.............................. done
abc
abc

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000101000000
0x00007fff89b5d1b3 in memchr ()
(gdb) where
#0  0x00007fff89b5d1b3 in memchr ()
#1  0x00007fff89b8e45a in __sfvwrite ()
#2  0x00007fff89b8e861 in fwrite ()
#3  0x0000000100003138 in _mh_execute_header ()
#4  0x0000000100002988 in _mh_execute_header ()
#5  0x0000000100001c28 in _mh_execute_header ()
#6  0x00007fff8e2d57e1 in start ()
(gdb)

マシンも再起動しました。gdbで同じことを繰り返します。

4

1 に答える 1