0

我有一个文件是 8 位编码的项目(Win-1251)。你能告诉我是否有办法使用git grep来查找由 ASCII 表顶部的字符组成的短语(即代码从 0x80 到 0xFF)?

我在 Windows 下工作。我使用控制台与 git 一起工作,似乎我传递给在git grep中搜索的文本(例如,git grep "привет")被此实用程序感知为 utf-8 字符序列,即git grep实际上正在尝试查找字节序列“\xD0\xBF\xD1\x80\xD0\xB8\xD0\xB2\xD0\xB5\xD1\x82”。

我还尝试执行此命令进行搜索:(git grep "\xEF\xF0\xE8\xE2\xE5\xF2"其中引号中的字节序列是"привет"Win-1251 中单词的 ASCII 码),但事实证明 grep 不接受转义序列。

4

2 回答 2

3

尝试使用-P标志:Perl regexp 应该理解转义序列


你可以将你的搜索模式写在一个文件中,然后你可以告诉 git grep 从这个文件中读取搜索模式:git grep -f patterns.txt ...

文件的好处是您可以更轻松地控制其内容的编码。

您还可以使用此功能构建一个脚本,该脚本将转换一个 UTF8 字符串并将其编码为 Win-1251,然后将其提供给git grep

pattern=$1
shift
echo $pattern | iconv -t WINDOWS-1251 > /tmp/rusgrep-pattern
git grep -f /tmp/rusgrep-pattern "$@"
于 2020-07-26T13:29:12.717 回答
1

受此要点@LeGEC 回答的启发,您可以执行以下操作-

git grep -P "$(iconv -f utf-8 <(echo -n 'привет') -t 'Windows-1251' | od -tx1 | sed -e 's/^[0-9]* //' -e '$d' -e 's/^/ /' -e 's/ /\\x/g')"

您可以将其放入 bash 函数中

function gitbingrep {
    git grep -P "$(iconv -f utf-8 <(echo -n "$1") -t 'Windows-1251' | od -tx1 | sed -e 's/^[0-9]* //' -e '$d' -e 's/^/ /' -e 's/ /\\x/g')"
}

现在你可以简单地运行gitbingrep привет

于 2020-07-26T13:59:23.663 回答