マンページがあり、特定のセクションで何かを探したいです。 Grepに問題があり、ヘッダーに制御文字が含まれていることが問題であることがわかりました。
SEE ALSO
それは真実です:
S^HSE^HEE^HE A^HAL^HLS^HSO^HO$
(ありがとう、cat -e
今日も何か学びました)
私は文字クラスや他の技術を使ってgrepとsedのさまざまなバリエーションで遊んでいましたが、それは理解できませんでした。
「セクション内のすべてのアイテムも参照してください」など、最もよく戻る方法について提案がありますか?これは他の人に役立つほど一般的であるべきですが、詳細な回答を提供できるほど具体的でなければなりません。 :)
man
この場合、出力はaws help
less にパイプされる他のコマンドによって生成されるので、実際には助けを必要としません。
答え1
一般版のマニュアルページを入手する方法のアイデアは次のとおりですman man
。
man foo | col -b
これに基づいて、次の1つの部分のみを取得できますpcregrep
。
man man | col -b | pcregrep -Mo '^SEE ALSO(.|\n)*?^[^ ]'
これを少し調整して関数に適用して、すべての部分のすべての部分をg
簡単に表すことができます。s
man
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"