117

OSX の新しいバージョンがサポートgrep -Pされなくなったため、一部のスクリプトが機能しなくなったようです。

var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`

grep を変数にキャプチャする必要があり、幅ゼロのアサーションを使用する必要があります。\K

var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`

任意の代替手段をいただければ幸いです。

4

13 に答える 13

118

スクリプトが自分専用の場合は、次を使用してインストールgrepできhomebrew-coreますbrew

brew install grep 

ggrepその後、 (GNU )として利用できますgrep。システムを置き換えるものではありませんgrep(インストールされた grep を のシステムの前に配置する必要がありますPATH)。

によってインストールされたバージョンにはオプションがbrew含まれている-Pため、スクリプトを変更する必要はありません。

これらのコマンドを通常の名前で使用する必要がある場合は、次のように、bashrc から PATH に「gnubin」ディレクトリを追加できます。

PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

~/.bashrc または ~/.zshrc でこの行をエクスポートして、新しいセッション用に保持できます。

古いオプションの長所と短所、および (最近の) 削除の議論については、こちらを参照してください。--with-default-names

于 2014-03-28T04:44:42.287 に答える
75

最小限の作業を行いたい場合は、

grep -P 'PATTERN' file.txt

perl -nle'print if m{PATTERN}' file.txt

変更する

grep -o -P 'PATTERN' file.txt

perl -nle'print $& while m{PATTERN}g' file.txt

したがって、次のようになります。

var1=`perl -nle'print $& while m{(?<=<st:italic>).*(?=</italic>)}g' file.txt`
var2=`perl -nle'print $& while m{(property:)\K.*\d+(?=end)}g' file.txt`

特定のケースでは、追加の作業でより単純なコードを実現できます。

var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt`
var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`
于 2013-05-20T21:27:31.047 に答える
11

OS X は、GNU ツールではなく BSD を提供する傾向があります。ただし、正規egrep表現検索を実行するために必要なのはおそらくこれだけです。

例:egrep 'fo+b?r' foobarbaz.txt

OSX grep man ページからのスニペット:

grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).

于 2016-03-30T13:36:43.003 に答える
7

use perl;

perl -ne 'print if /regex/' files ...

grepより多くのオプションが必要な場合(-o少なくとも必要だと思います)、さまざまなpgrep実装がネット上に浮かんでおり、その多くは Perl です。

「ほぼ Perl」で十分な場合、PCRE はpcregrep.

于 2013-05-20T21:03:00.790 に答える
4

「-E」オプションを使用するのはどうですか? たとえば、私が使用するphp -mphp_zipから, php_xml,php_gd2拡張子を確認したい場合、それは私にとってはうまくいきます:

php -m | grep -E '(zip|xml|gd2)'
于 2016-12-08T01:52:32.850 に答える
3

受け入れられた回答と同等ですが、-P スイッチは必要ありません。これは、私が利用できる両方のマシンには存在しませんでした。

find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
于 2016-05-18T08:17:16.587 に答える
2

これは私のために働いた:

    awk  -F":" '/PATTERN/' file.txt
于 2016-08-15T19:57:49.390 に答える