答え1
aptitude
システムCライブラリのPOSIX / APIを使用したregcomp()
正規表現の一致regexec()
着信電話regcomp()
そしてREG_ICASE | REG_EXTENDED
バナーしたがって、本質的に1と同じ結果が得られ、大文字とgrep -iE
小文字を区別する機能はデフォルトでサポートされていません。
もう少しの努力だけ傾けるなら、できることがまだ残っています。結局のところ、このソフトウェアはすべて無料でオープンソースソフトウェアなので、実行できる操作に制限はありません。
たとえば、フラグを削除するトリックを使用してregcomp()
libc関数呼び出しを傍受できます。LD_PRELOAD
REG_ICASE
$ cat case-sensitive.c
#define _GNU_SOURCE
#include <dlfcn.h>
#include <regex.h>
int regcomp (regex_t *_Restrict_ __preg,
const char *_Restrict_ __pattern,
int __cflags)
{
static int (*orig) (regex_t *_Restrict_ __preg,
const char *_Restrict_ __pattern,
int __cflags) = 0;
if (!orig)
orig = (int (*) (regex_t *_Restrict_ __preg,
const char *_Restrict_ __pattern,
int __cflags)) dlsym (RTLD_NEXT, "regcomp");
return (*orig)(__preg, __pattern, __cflags & ~REG_ICASE);
}
$ gcc -fPIC -shared -o case-sensitive.so case-sensitive.c
zsh
その後、説明に以下を含むパッケージを検索して効果を確認できますZsh is a UNIX command interpreter
。
$ apt-cache show zsh
Package: zsh
[...]
Description-en_GB: shell with lots of features
Zsh is a UNIX command interpreter (shell) usable as an interactive login
[...]
$ aptitude search -F %p '~n "^zsh$" ~d "Zsh .* unix"'
zsh
zsh:i386
$ LD_PRELOAD=$PWD/case-sensitive.so aptitude search -F %p '~n "^zsh$" ~d "Zsh .* unix"'
$ LD_PRELOAD=$PWD/case-sensitive.so aptitude search -F %p '~n "^zsh$" ~d "Zsh .* UNIX"'
zsh
zsh:i386
case-insensive.so
libcのregcomp()
/ APIを使用すると、何でも使用できますregexec()
。デバッガなどに一致する特定の正規表現に対してアクションが実行されたかどうかを確認ltrace
できます。
int regcomp(addr, string, bitvec(int));
に追加~/.ltrace.conf
:
$ ltrace -e regcomp aptitude search ZZZ
[...]
libapt-pkg.so.6.0->regcomp(0x55d9a6f1ad60, "^linux-image-[a-z0-9]*-[a-z0-9]*"..., <0-1,3>) = 0
libapt-pkg.so.6.0->regcomp(0x55d9a6f2f060, "^linux-.*-6\\.6\\.15-amd64$|^linux"..., <0-1,3>) = 0
aptitude->regcomp(0x55d9a6f1cb10, "linux-image-.*", <0-1>) = 0
aptitude->regcomp(0x55d9a6f62980, "linux-image-.*", <0-1,3>) = 0
libapt-pkg.so.6.0->regcomp(0x55d9a6ed08c0, "^linux-.*-.*$|^kfreebsd-.*-.*$|^"..., <0-1,3>) = 0
aptitude->regcomp(0x55d9a6f60270, "ZZZ", <0-1>) = 0
aptitude->regcomp(0x55d9a6f5e830, "ZZZ", <0-1,3>) = 0
p elpa-zzz-to-char - fancy version of `zap-to-char' command
p python3-zzzeeksphinx - Zzzeek's Sphinx layout and utilities
(ここでフラグはビットベクトルで表され、0はREG_EXTENDED
1ですREG_ICASE
。)
一部の適切なライブラリーのaptitude
間接呼び出しによってregcomp()
シャットダウンがREG_ICASE
問題を引き起こす可能性がある方法を理解してください。
またsearch
。aptitude
特に、この$LD_PRELOAD
変数は実行するすべてのコマンドに渡されるので、望ましくありません。インストールするすべてのパッケージはaptitude
これらの環境で始まります。これに関して、共有オブジェクトファイルをプリロードする方が良いでしょう。/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --preload "$PWD/case-sensitive.so" /usr/bin/aptitude search...
これを行うと。aptitude
GNUはed
libcのPOSIX正規表現APIも使用します。
$ echo /Debian/I | ltrace -e regcomp ed -sE /etc/issue
ed->regcomp(0x5653bd71f520, "Debian", <0-1>) = 0
Debian GNU/Linux trixie/sid \n \l
+++ exited (status 0) +++
$ echo /Debian/I | LD_PRELOAD=$PWD/case-sensitive.so ed -sE /etc/issue
Debian GNU/Linux trixie/sid \n \l
$ echo /debian/I | LD_PRELOAD=$PWD/case-sensitive.so ed -sE /etc/issue
?
標準EREには大文字と小文字を区別しないオン/オフの演算子はありませんが、Perl正規表現を(?i)
(?-i)
他のツールにインポートするように設計されたライブラリであるPCRE2と同様に、Perl正規表現を使用できます。 Perl正規表現はほとんどEREと互換性があります。
PCRE2はライブラリ内のregcomp()
/ standard APIをサポートしています。regexec()
libpcre-posix
したがって、aptitude
標準EREの代わりにPCRE2を使用するように変更するのは比較的簡単です。
たとえば、PoCとして私がすべきことは次のとおりです。
$ sudo apt build-dep aptitude
$ apt source aptitude
$ cd aptitude*(/)
次のように1つを作成しますsrc/regex.h
。
$ cat src/regex.h
#ifndef _REGEX_H
#define _REGEX_H 1
#include <pcre2posix.h>
#endif
その後、ビルドします。
dpkg-buildpackage -b -j5
欠落のため失敗しました-lpcre2-posix
。私がしなければならないことは次のとおりです。
make -C build MAYBE_LIBGTK=-lpcre2-posix
(これは、MAYBE_LIBGTK
ファイルの変更を防ぐために、リンクフェーズで参照される未設定のmake変数を使用します。)
次に、正規表現をaptitude
使用することがありますPCRE2
。
$ build/src/aptitude search -F %p '~n "^zsh$" ~d "Zsh .* unix"'
zsh
zsh:i386
$ build/src/aptitude search -F %p '~n "^zsh$" ~d "(?-i)Zsh .* unix"'
$ build/src/aptitude search -F %p '~n "^zsh$" ~d "(?-i)Zsh .* UNIX"'
zsh
zsh:i386
1 GNU の場合、grep
使用される正規表現エンジンと API はバージョンとさまざまな要因によって異なりますが、regcomp()
GNU libc を使用するシステムでもシステム libc では / を使用しない場合があります。regexec()