zshエイリアスでの引用符のエスケープ


12

テキストから改行を取り除くことに関するこの質問に続き、これを次のようにzshエイリアスに変換したいと思います。

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

awkスクリプト内で引用符をエスケープしてみましたが、次のエラーが発生します。

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

(ファイルはと呼ばれますbspsrobustness

やりたいことはありますか?これをzshエイリアスではなくawkスクリプトに変換できると思いますが、これが最善のオプションですか?


ちなみに、これは(cshではなくBourneスタイルの)すべてのシェルに適用されます。
Gilles「SO-邪悪なことをやめなさい」

回答:


9

エイリアスの代わりにzsh関数を使用できます。ジャンプする引用フープはありません。

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

そして、私はそれをどのように呼びstriplines filenameますか?
Seamus

何をし"$@"ているのか説明してもらえますか?
Seamus

@Seamus、そう、あなたはそれをまさにそのように呼ぶでしょう。"$@":あなたのファイル名のいずれかがスペースを含む、たとえば、場合に必要-構文が乱さAWKにストリップライン引数を送るstriplines "file 1" "file 2"のawkに2つのファイル名を送信します。
グレン・ジャックマン、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);}'\'

この長い説明の後、推奨事項:エイリアスに対して複雑すぎる場合は、関数を使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.