制御文字を含むマンページでタイトルを見つける方法

制御文字を含むマンページでタイトルを見つける方法

マンページがあり、特定のセクションで何かを探したいです。 Grepに問題があり、ヘッダーに制御文字が含まれていることが問題であることがわかりました。

SEE ALSO

それは真実です:

S^HSE^HEE^HE A^HAL^HLS^HSO^HO$

(ありがとう、cat -e今日も何か学びました)

私は文字クラスや他の技術を使ってgrepとsedのさまざまなバリエーションで遊んでいましたが、それは理解できませんでした。

「セクション内のすべてのアイテムも参照してください」など、最もよく戻る方法について提案がありますか?これは他の人に役立つほど一般的であるべきですが、詳細な回答を提供できるほど具体的でなければなりません。 :)

manこの場合、出力はaws helpless にパイプされる他のコマンドによって生成されるので、実際には助けを必要としません。

答え1

一般版のマニュアルページを入手する方法のアイデアは次のとおりですman man

man foo | col -b

これに基づいて、次の1つの部分のみを取得できますpcregrep

man man | col -b | pcregrep -Mo '^SEE ALSO(.|\n)*?^[^ ]'

これを少し調整して関数に適用して、すべての部分のすべての部分をg簡単に表すことができます。sman

gsman () { man $1 | col -b | pcregrep -iMo "^$2(.|\n)*?(?=\n[A-Z])" ; }

そして使い方は

gsman grep options | grep invert

答え2

ここでは、16進ダンパ(hexdump、、xxd)が役に立ちます。ascii(7)

man ls | hexdump -C
...

これは次のことを示します。

000045f0  35 29 2e 0a 0a 53 08 53  45 08 45 45 08 45 20 41  |5)...S.SE.EE.E A|
00004600  08 41 4c 08 4c 53 08 53  4f 08 4f 0a 20 20 20 20  |.AL.LS.SO.O.    |

これは16進コード8またはバンドルbs^Hディスプレイのcat意味)です。皮をむく方法にはbsいくつかの方法があります。

% man ls | perl -ple 'tr/\x08//d' | grep SEE
SSEEEE AALLSSOO

まあ、それは悪いです。また、バックスペース文字を削除する必要があります。

% man ls | perl -ple 's/.\x08//g' | perl -00 -nle 'print if m/SEE ALSO/'
SEE ALSO
     chflags(1), chmod(1), sort(1), xterm(1), compat(5), termcap(5),
     symlink(7), sticky(8)

答え3

section="SEE ALSO"
regex=$(sed 's/./&.*/g' <<<"$section")       # S.*E.*E.* .*A.*L.*S.*O.*
# then
some help command | sed -n '/^'"$regex"'/,/^[^[:blank:]]/ p' | sed '$d'
  • 正規表現は、与えられたセクション名の各文字間の任意の文字数を受け入れます。
  • 最初のsedコマンドは、正規表現の指定された部分と次の部分の間の行のみを出力します(その部分のすべての行には先行スペースがあると仮定します)。
  • 2 番目の sed コマンドは、末尾のセクションヘッダーを削除します。

Bash関数で:

man_section() {
    local section=$1
    local regex=$(sed 's/./&.*/g' <<<"$section")
    sed -n '/^'"$regex"'/,/^[^[:blank:]]/ p' | sed '$d'
}

some help command | man_section "SEE ALSO"

関連情報