zshの `print -P`のエスケープ変数

zshの `print -P`のエスケープ変数

print -P型指定子と引用符、バックスラッシュ、改行文字などの特殊文字を含む変数をエスケープして、渡されたときに文字通り印刷されるようにする方法を探しています。

だから本質的に、私はこれら2つを同じように印刷したいと思います。

> cat file.txt
> my_var="$(cat file.txt)"
> print -P "${<magic>my_var}"

私が使用するテストケースの良いサンプルファイルは次のとおりです。

Backslash \
Double Backslash \\

Single Quote '
Double Quote "

-----------------------
Escaped Linebreak \n
-----------------------

Color codes: %F{red}not red%f

Variable expansion $SHELL

私が得た最も近い問題は、${${(q+)my_var}//\%/%%}引用符、改行、バックスラッシュ、変数の拡張に関する問題でした。

$'Backslash Double Backslash \

Single Quote '
Double Quote "

-----------------------
Escaped Linebreak \n
-----------------------

Color codes: %F{red}not red%f

Variable expansion /usr/bin/zsh'

わかりましたprintf '%s\n' "$my_var"。しかし、実際には変数の周りに実際の書式がたくさんあるので、print -Pこれは私には適していません。残念ながら、print -P変数の周りと実際の変数で使用することはprintf機能しません。なぜなら、文字列演算が変数の内容に適用されることもあるからです。

ベストアンサー1

${(q)…}そのバリアントは'…'"…"または$'…'引用符を使用しますが、引用符拡張はprint -P実行せず、バックスラッシュ拡張とヒント拡張のみを実行します(パーセントエスケープ拡張と有効になっているprompt_subst場合は置換を含む)。だから${(q)…}ここでは役に立たないと思います。

無効にすると、prompt_substバックスラッシュとパーセント記号を保護する必要があります。有効になったら、prompt_substドルとバックティックも保護する必要があります。

if [[ -o prompt_subst ]]; then
  print -P -- "${${${${my_var//\\/\\\\\\\\}//\%/%%}//\$/\\\\\$}//\`/\\\\\`}"
else
  print -P -- "${${my_var//\\/\\\\}//\%/%%}"
fi

おすすめ記事