Shell
在 zsh 別名中轉義引號
繼這個關於從文本中去除換行符的問題之後,我想將其轉換為 zsh 別名,如下所示:
alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
我嘗試轉義 awk 腳本中的引號,但出現此錯誤:
awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted
(該文件稱為
bspsrobustness
)有沒有辦法做我想做的事?我想我可以把它變成一個 awk 腳本而不是一個 zsh 別名,這是我最好的選擇嗎?
您可以使用 zsh 函式而不是別名。沒有引用箍跳過。
striplines() { awk '... awk body "with quotes" ...' "$@" }
要了解發生了什麼,請執行
% alias striplines='print -lr awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"' % striplines awk /^$/ {print "\n"; } /./ {printf( " %s ",zsh);}
由於
$
字元在雙引號中(在擴展別名後擴展它們時),它們由 shell 解釋。為了正確引用,將整個別名定義放在單引號中會更容易。單引號內的內容是使用別名時將擴展的內容。現在參數 ofawk
用雙引號括起來,很明顯您需要在\"$
.alias striplines='print -lr awk " /^\$/ {print \"\n\"; } /./ {printf( \" %s \",\$0);}"'
單引號單引號字元串的一個有用習慣用法是,這
'\''
幾乎是一種將文字單引號放入單引號字元串的方法。從技術上講,有一個單引號字元串、一個反斜杠引號'
和另一個單引號字元串並列。末尾並列的空字元串''
可以刪除。alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'
經過這麼長的解釋,一個建議:當別名太複雜時,使用函式。