私は現在リストされているすべてのマニュアルページequery files <PACKAGE> | grep /usr/share/man/man
(慣れていない場合はequery
パッケージのGentooベースのシステムで使用されるツールapp-portage/gentoolkit
)をHTMLファイルと必要ないくつかの情報に変換するBash関数を書いています。フルパスからマニュアルページ名(ファイル拡張子なし)を除くすべてのエントリを削除するにはどうすればよいですか?この表現が混乱する可能性があることを知っているので、例えば私が意味するものを説明します。実行すると、equery files sys-apps/portage | grep /usr/share/man/man
次の出力が提供されます。
/usr/share/man/man1
/usr/share/man/man1/dispatch-conf.1.bz2
/usr/share/man/man1/ebuild.1.bz2
/usr/share/man/man1/egencache.1.bz2
/usr/share/man/man1/emaint.1.bz2
/usr/share/man/man1/emerge.1.bz2
/usr/share/man/man1/emirrordist.1.bz2
/usr/share/man/man1/env-update.1.bz2
/usr/share/man/man1/etc-update.1.bz2
/usr/share/man/man1/fixpackages.1.bz2
/usr/share/man/man1/quickpkg.1.bz2
/usr/share/man/man1/repoman.1.bz2
/usr/share/man/man5
/usr/share/man/man5/color.map.5.bz2
/usr/share/man/man5/ebuild.5.bz2
/usr/share/man/man5/make.conf.5.bz2
/usr/share/man/man5/portage.5.bz2
/usr/share/man/man5/xpak.5.bz2
この出力では、例の目的のために最後の行を使用しました/usr/share/man/man5/xpak.5.bz2
(以前使用した構文では、このマニュアルページのフルパスでした)。次に、Bashスクリプトから抽出したいのはxpak.5
(拡張子を除くファイル名です)です。どうすればいいですか?現在このBash機能を使用しています。
function manhtmlp {
for i in `equery files "$1" | grep /usr/share/man/man`
do
bzcat $i | mandoc -Thtml > $HOME/GitHub/fusion809.github.io/man/${i}.html
sudo chmod 777 -R $HOME/GitHub/fusion809.github.io/man/${i}.html
done
}
5行目と6行目では、記号を使用して${i}
マニュアルページのファイル名のフルパス(拡張子なし)を切り取ることができる場所を示します。ユーザー提供の入力(この関数でマークされている)は、カテゴリを含むパッケージ名を表します(たとえば、Portageパッケージマネージャの場合と$1
同じです)。sys-apps/portage
編集する:この質問が他の質問と異なるのはなぜですか?ファイル名を取得するためのディレクトリパスの削除。
以前の質問に対する答えは私が望むものと似ていますが、ファイル名からファイル拡張子を削除する方法を知らず、パスの残りの部分だけを削除します。したがって、上記の質問に対する答えの例では、/usr/share/man/man5/xpak.5.bz2
このフルファイルパスを削除する方法が提供xpak.5.bz2
されていますがxpak.5
。
答え1
使用パラメータ拡張:
line="/usr/share/man/man5/xpak.5.bz2"
# printf "%s\n" "${line##*/}"
# xpak.5.bz2
file="${line##*/}"
printf "%s\n" "${file%.*}"
xpak.5
Zshではできますネストされたパラメータ拡張:
printf "%s\n" "${${line##*/}%.*}"
xpak.5
答え2
使用basename
:
NAME
basename - strip directory and suffix from filenames
SYNOPSIS
basename NAME [SUFFIX]
basename OPTION... NAME...
DESCRIPTION
Print NAME with any leading directory components removed. If specified, also remove a trailing SUFFIX.
例:
$ file="/usr/share/man/man5/xpak.5.bz2"
$ echo "$(basename "$file" .bz2)"
xpak.5
sed
サフィックスがわからない場合は、次のものを使用することもできます。
$ file="/usr/share/man/man5/xpak.5.bz2"
$ echo "$(basename "$file" | sed 's/\(.*\)\..*/\1/')"
$ xpark.5