Shell

在 zsh 別名中轉義引號

  • August 30, 2020

這個關於從文本中去除換行符的問題之後,我想將其轉換為 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);}'\'

經過這麼長的解釋,一個建議:當別名太複雜時,使用函式

引用自:https://unix.stackexchange.com/questions/7951