これが次の出力であると仮定しますpwd
。
/home/amarakon/.local/src/amarakon/scripts/src
これをどのように変更できますか?
~/.local/src/amarakon/scripts/src
私は次のコマンドを試しました。
pwd | sed 's|/home/.*|~|'
しかし、結果は次のようになります。
~
ベストアンサー1
使用している場合は、zsh
次のものを使用できます。
print -P '%~'
現在の作業ディレクトリを取得するには、ホームディレクトリをに置き換えます~
。これはホームディレクトリであり、以前に拡張された場合でもに/home/directory/of/otheruser
置き換えられます。~otheruser
/home/directory/of/otheruser
otheruser
~otheruser
通常、現在の作業ディレクトリを取得するには、%~
yourと入力します。$PROMPT
オプションを使用すると、組み込み機能をすばやく拡張できます-P
。print
%
パラメータ拡張フラグを使用して、パラメータ拡張中に拡張を促すこともできます。
printf '%s\n' ${(%):-%~}
~
この置換はパラメータ拡張フラグを使用して有効にすることもできます。したがって、次のこともD
できます。
printf '%s\n' ${(D)PWD}
手動で行うこともできます。
set -o extendedglob
printf '%s\n' ${PWD/#%(#b)$HOME(|\/*)/\~$match[1]}
$HOME
ただし、シンボリックリンクまたは.
パスコンポーネントがある$PWD
場合、またはシンボリックリンクコンポーネントがある場合は、他のファミリ表現を含む変数で終わるため、これが機能しない可能性があることに注意してください。
sed
任意の値に対してこれを行う場合は、これが問題になる可能性があります$HOME
。あなたはする必要があります/
まず、エスケープと正規表現演算子(.
正規表現演算子で、ユーザー名で一般的です)C
dirパスがテキストであると保証されていないため、ロケールでこれを行います。すべての行を$PWD
パターンスペースの先頭にのみロードし、トピック/
の置換または終了に従ったときにのみロードします。
escaped_HOME=$(printf '%s\n' ~ | LC_ALL=C sed '
:1
$!{
N
b1
}
s:[][\\/.^$*]:\\&:g
s/\n/\\n/g'
)
pwd | LC_ALL=C sed '
:1
$!{
N
b1
}
s/^'"$escaped_HOME"'\(\(\/.*\)\{0,1\}\)$/~\1/'
最高のツールではありません。そしてperl
:
perl -MCwd -le 'print getcwd =~ s|^\Q$ENV{HOME}\E(?![^/])|~|r'
その場合は、一部のシステムユーザーの場合と同様に、$HOME
「which」を「or」に置き換えないことをお勧めします。手動式は交換される予定ですが、私の考えでは許可されていません。/
%~
/
~
/dir
~/dir
/
~
/dir
~/dir