適性検索を大文字と小文字を区別することはできますか?

適性検索を大文字と小文字を区別することはできますか?

スクリプトから:

資格検索?説明($1)

...大文字と小文字を区別できますか?

答え1

aptitudeシステムCライブラリのPOSIX / APIを使用したregcomp()正規表現の一致regexec()着信電話regcomp()そしてREG_ICASE | REG_EXTENDEDバナーしたがって、本質的に1と同じ結果が得られ、大文字とgrep -iE小文字を区別する機能はデフォルトでサポートされていません。

もう少しの努力だけ傾けるなら、できることがまだ残っています。結局のところ、このソフトウェアはすべて無料でオープンソースソフトウェアなので、実行できる操作に制限はありません。

たとえば、フラグを削除するトリックを使用してregcomp()libc関数呼び出しを傍受できます。LD_PRELOADREG_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.solibcの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_EXTENDED1ですREG_ICASE。)

一部の適切なライブラリーのaptitude間接呼び出しによってregcomp()シャットダウンがREG_ICASE問題を引き起こす可能性がある方法を理解してください。

またsearchaptitude特に、この$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はedlibcの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()

関連情報