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