按特殊字符 grep ”

grep by special character ”

如何使用特殊字符 grep 文件注意与 "

不同

我试过转义它但没用。

当我用 vim 打开文件时,它显示为 <94>

文件示例

<p>"hello”></p>

我希望能够grep -rne "\”"

使用现代 GNU grep 和正确配置的语言环境,这应该可以正常工作。

如果您的 grep 不熟悉 8 位或您的语言环境被破坏,也许可以尝试

perl -ne 'print if /\x94/' files ...

在 Perl 中重新实现 grep -rn 并不难,但如果这是一个快速 one-off,请尝试

find . -type f -exec perl -ne 'print "$ARGV:$.:$_" if /\x94/' {} +

从某种意义上说,如果 \x94 显示为弯引号,则您的语言环境 的,或者至少是不标准的。您的系统显然配置为使用一些遗留 Windows 8 位编码...?

大引号不是 shell 或正则表达式元字符,因此不需要反斜杠。


在更多细节中,根据评论,根本问题是您的系统设置为使用 UTF-8,但文件使用不同的编码。所以 grep "”" 真正搜索 U+201D 的 UTF-8 编码,它转换为 perl -ne 'print if /\xe2\x80\x9d/'

如果你不知道字符的字节值,但知道编码,你可以这样做

echo "”" | iconv -f utf-8 -t ENCODING | grep -f -

当然,你可以通过类似的方式轻松获取字节值;

echo "”" | iconv -f utf-8 -t ENCODING | xxd

或者只是在像 less 这样的工具中查看文件,它以十六进制显示未知字节。

也许还可以参见 https://tripleee.github.io/8bit#9d——只有一个字节,文件使用哪种精确编码并不重要(如果它是 HTML,HTML 中的默认值令人困惑的是,5 是 Windows 代码页 1252),但如果您有一些未知字节,您知道或可以猜测预期的呈现,这个 table 可以帮助您建立精确的编码。

如果您的 grep 不懂 8 位,也许您使用的是来自 Retrocomputing 博物馆的设备。如果您的语言环境很奇怪,也许可以解决这个问题 - 理想情况下您想要 UTF-8 everywhere.