Jeśli masz komputer Mac, spróbuj tego:grep -f na OS X produkuje segfault
echo 'abcd*' > grepfile
echo 'abc$' >> grepfile
echo '^abc' >> grepfile
echo "fojeiwuroiuwet\nljfajsljkfabcdddjlfkajlkj\nabcaaa\nzzzabc\n" | grep -f grepfile
Oto wersja:
$ grep --v
grep (BSD grep) 2.5.1-FreeBSD
Jest to maszyna (a rMBP z 2012 roku smak), który jest aktualizowany przez aktualizacje oprogramowania Apple, więc jestem na 10.8.4.
Sprawdziłem, że GNU grep
skompilowany ze źródła nie cierpi z powodu tego problemu. Rzeczywiście jest to wersja 2.14, która jest dużo wersji po 2.5.1.
Ale w jaki sposób można wykonać zadanie testowania niektórych danych wejściowych w odniesieniu do serii wyrażeń regularnych w inny sposób, bez jakiejś bardzo nieefektywnej pętli, która przesyła grep dla każdego wyrażenia regularnego?
Edycja: podejście, które podjąłem, aby obejść ten problem, było podobne do: while read REGEX; do [[ ... =~ $REGEX ]] ... done < regexfile
.
Pytanie: Czy jest to znany błąd w tej wersji grep? Jak możemy skonfigurować nasze systemy, aby działały poprawnie z plikiem wyrażeń regularnych do grep?
Aktualizacja: Wygląda na to, że niektórzy ludzie zgłaszają, że działa dobrze (nawet z tym szczególnym grepem FreeBSD 2.5.1). Jakie kroki mogę podjąć, aby spróbować dowiedzieć się, który plik .so/.dylib może być używany? Czy ktoś może zrobić shasum /usr/bin/grep
i powiedzieć mi, czy to działa dla Ciebie? (Nie jestem pewien, czy to by dostarczyć dużo informacji, ale co mi po tym, czy konfiguracja mojego komputera jest wkręca się, czy to jakiś rzeczywisty problem istniejący w tej wersji oprogramowania.)
$ shasum /usr/bin/grep
eac59389d09642decbb8551e2c975f795934bfbf /usr/bin/grep
Oto więcej informacji:
$ 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
Dalsze badania:
$ 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)
I ponownym uruchomieniu urządzenia, jak również. Powtarzalnie robi to samo w gdb.
Następnie przeszedłem do mojego Macbook Air i to działało, a potem sprawdzane i ma homebrew grep 2.14 zainstalowany. Sądzę, że testowałem grep vs ack w dniu, kiedy dowiedziałem się o ACK. Jest to więc inny sposób na uzyskanie odpowiedniego grepa na Macu, użyj homebrew. To było trochę smutne, ponieważ użyłem homebrew, aby uzyskać 'gettext' w celu skompilowania grepa bez nawet sprawdzenia' grep' w pierwszej kolejności ... –
To denerwujące, aby ponownie znaleźć odpowiedzi na rzeczy już znalezione przez przeszłość-mnie . To warzy formuła 'homebrew/dupes/grep'. –
FWIW, Twój przykład działa dobrze dla mnie z magazynem Apple/usr/bin/grep (również 2.5.1-FreeBSD) dostarczanym z OS X 10.8.4. –