Zshzsh 的
zsh 的 print -P
的轉義變數
我正在尋找一種方法來轉義包含格式說明符和特殊字元(如引號、反斜杠和換行符)的變數,以便在將其傳遞給
print -P
它時會按字面意思列印出來。所以基本上我希望這兩個列印相同:
> 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
也不起作用,因為在某些情況下,字元串操作被應用於變數的內容。
${(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