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に設定しました。マニュアルページを閲覧したところ、最後に次のことがわかりました。PAGERMANPAGERman

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

私の考えに最適な手がかりは、「というフレーズのマニュアルページです。バックスペースキーやアンダースコアなし'。もちろん、各文字の間に2文字を許可すると、slurp予想される行が表示されます。

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

od -a検査ラインの1つを使用すると、--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.これは、レンダラーが明らかにバックスペースキーを使用し、文字列の太字印刷を示すために文字を再印刷することを示す行の一部です--slurpfile。バックスペースキーと追加文字は単純なgrepコマンドを無効にします。 (私も)

したがって、col -b以前にマニュアルページをパイピングすると、目的のgrep方法で出力を取得できるように見えます。

おすすめ記事