在zsh别名中转义引号


12

关于这个关于从文本中去除换行符的问题之后,我想将其转换为zsh别名,如下所示:

alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'

我尝试将awk脚本中的引号转义,但出现此错误:

awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted

(该文件称为bspsrobustness

有什么方法可以做我想要的吗?我想我可以将其转换为awk脚本而不是zsh别名,这是我的最佳选择吗?


顺便说一下,这适用于所有(Bourne风格,而不是csh)shell。
吉尔(Gilles)'所以

Answers:


9

您可以使用zsh函数代替别名。没有报价栏可以跳过。

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}

然后,我将如何称呼它:striplines filename
Seamus

你能解释一下"$@"做什么吗?
Seamus

@Seamus,是的,您完全可以这样称呼它。该"$@"语法发送带状线参数AWK不受干扰-如果有必要,比方说,你的任何文件名包含空格:striplines "file 1" "file 2"将发两个文件名给AWK。
glenn jackman 2011年

5

要了解发生了什么,请运行

% alias striplines='print -lr awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
% striplines
awk
 /^$/ {print "\n"; } /./ {printf( " %s ",zsh);}

由于$字符用双引号引起来(当别名被扩展后又被扩展时),它们由外壳解释。为了获得正确的报价,将整个别名定义放在单引号中会更容易。单引号内的内容是使用别名时将扩展的内容。现在,的参数awk已用双引号引起来,很明显,您需要在之前加反斜杠\"$

alias striplines='print -lr awk " /^\$/ {print \"\n\"; } /./ {printf( \" %s \",\$0);}"'

单引号单引号的一个有用的成语是,这'\''几乎是一种将文字单引号放在单引号中的方式。从技术上讲,单引号字符串,反斜杠'和另一个单引号字符串并列。''末端并排的空字符串可以删除。

alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'

经过冗长的解释后,提出了一个建议:当别名太复杂时,请使用function

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.