为什么无法通过 grep 命令过滤手册页?

为什么无法通过 grep 命令过滤手册页?

我不确定我的系统是否发生了一些变化,但我发现通过我的grep命令过滤 Unix 手册页不起作用。你知道出了什么问题吗?

例如,考虑jq 手册页从以下代码编译而来。

.
.IP "\(bu" 4
\fB\-\-slurp\fR/\fB\-s\fR:
.
.IP
Instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once\.
.

如果我想快速查找交换机--slurp,那么我通常会过滤jq手册页,grep如以下终端会话所示。

$ man jq | grep -- --slurp
$

请注意如何没有返回任何内容。这很奇怪,预期的结果如下所示。

$ man jq | grep -- --slurp
       •   --slurp/-s:

这是预期的,因为如果我实际运行man jq命令并使用/搜索击键,然后搜索--slurp,那么就可以了。

# ...
       •   --slurp/-s:

           Instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once.

我猜特殊字符有问题,但我不确定。我尝试通过命令放置手册页cat,但这也不起作用。我还尝试删除所有特殊字符 - 请参阅如何删除Linux文本中的所有特殊字符——但这也行不通。

$ man jq | cat | grep -- --slurp
$
$ man jq | sed $'s/[^[:print:]\t]//g' | grep -- --slurp
$

如果相关,请参阅以下有关我的系统的详细信息。

$ neofetch --off
OS: macOS 13.0.1 22A400 x86_64
Host: MacBookPro16,1
Kernel: 22.1.0
Uptime: 6 days, 1 hour, 3 mins
Packages: 145 (brew)
Shell: bash 3.2.57
Resolution: 1792x1120@2x
DE: Aqua
WM: Quartz Compositor
WM Theme: Blue (Light)
Terminal: iTerm2
Terminal Font: Monaco 12
CPU: Intel i7-9750H (12) @ 2.60GHz
GPU: Intel UHD Graphics 630, AMD Radeon Pro 5300M
Memory: 10425MiB / 16384MiB

答案1

我在我的 Mac 笔记本电脑上看到了和你一样的东西。我曾经man -P cat将寻呼机设置为 cat 而不是设置PAGERMANPAGER环境变量。当我浏览 的手册页时man,我在结尾处发现了这一点:

To get a plain text version of a man page, without backspaces and underscores, try

         # man foo | col -b > foo.mantxt

所以我尝试了一下man jq | col -b | grep slurp,得到了其中的行slurp,包括--slurp论证行。

我认为最好的线索是手册页中的短语'没有退格键和下划线'。果然,如果我允许 的每个字母之间有两个字符slurp,那么我会看到我期望的行:

man -P cat jq | grep s..l..u..r..p

使用od -a检查其中一行--slurp给了我这个:

0000420   sp   U   s   e  sp   -  bs   -   -  bs   -   s  bs   s   l  bs
0000440    l   u  bs   u   r  bs   r   p  bs   p   f  bs   f   i  bs   i
0000460    l  bs   l   e  bs   e  sp   i   n   s   t   e   a   d   .  nl

这是一行的一部分,显示Use --slurpfile instead.The renderer显然使用退格键并再次打印字母来表示字符串的粗体打印--slurpfile。退格键和额外的字母打败了简单的 grep 命令。 (我也是)

因此,看起来col -b之前通过管道传输手册页grep可以让您按照自己想要的方式搜索输出。

相关内容