sed コマンドを使用して /home/user を ~ に置き換える方法

sed コマンドを使用して /home/user を ~ に置き換える方法

これが次の出力であると仮定します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/otheruserotheruser~otheruser

通常、現在の作業ディレクトリを取得するには、%~yourと入力します。$PROMPTオプションを使用すると、組み込み機能をすばやく拡張できます-Pprint

%パラメータ拡張フラグを使用して、パラメータ拡張中に拡張を促すこともできます。

printf '%s\n' ${(%):-%~}

~この置換はパラメータ拡張フラグを使用して有効にすることもできます。したがって、次のこともDできます。

printf '%s\n' ${(D)PWD}

手動で行うこともできます。

set -o extendedglob
printf '%s\n' ${PWD/#%(#b)$HOME(|\/*)/\~$match[1]}

$HOMEただし、シンボリックリンクまたは.パスコンポーネントがある$PWD場合、またはシンボリックリンクコンポーネントがある場合は、他のファミリ表現を含む変数で終わるため、これが機能しない可能性があることに注意してください。

sed任意の値に対してこれを行う場合は、これが問題になる可能性があります$HOME。あなたはする必要があります/まず、エスケープと正規表現演算子.正規表現演算子で、ユーザー名で一般的です)Cdirパスがテキストであると保証されていないため、ロケールでこれを行います。すべての行を$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

おすすめ記事