フィールドを区切るためにバックスラッシュまたは一重引用符を使用する

フィールドを区切るためにバックスラッシュまたは一重引用符を使用する

私はいつも次のようにフィールドを区切るために一重引用符を使用しました。awk -F';' ...

私にとってかなり新しい点は、次のようにバックスラッシュを使用する方法です。awk -F\; ...

2つの間に技術的な違いはありますか、それとも単に好みの問題ですか?

答え1

これはシェルではなくシェルに関連していますawk

Bourne のようなシェルでは、 、 、ともに\参照演算子です。'...'"..."

引用符はシェル構文から文字が持つことができる特別な意味を削除します。\単一文字を引用し(削除される改行文字を除く)、複数の文字を引用することができます('...'改行文字を除く)。"...""..."引用する文字ごと)。

;シェル構文の特殊文字です。コマンドを区切るために使用されます。コマンドにそのまま渡すには、それを引用する必要があります。 \;';'します。

";";二重引用符の中にはまだ特殊な文字の1つではありませんが、"\\"リテラルバックスラッシュをコマンドに渡す必要があります\。二重引用符の中でまだ特殊な文字の1つも同じです"..."(後に来る場合のみ)。特殊)は、"..."自分と同じように他の特殊文字で構成されています"

繰り返しますが、これはエンクロージャによって大きく異なります。たとえば、およびは引用符はもちろん、rcシェルでは特別ではなく、コマンドはおよび-区切りコマンドで解析されるため、何の効果もありません。\"-F\;awk -F\...;

バラより通常の文字のように特殊文字を使用する方法は?詳細については。

状況をより複雑にするには、引数-F自体に注意してください。返品1つまたは2つのバックスラッシュで処理awk経由

awkまず、受け取った引数を処理して、その中のANSI Cエスケープシーケンスを拡張します。awk -F '\t'またはまたはawk -F \\tawk -F "\\t"使用すると、埋め込み引数が受け取られ、awk -F "\t"タブ文字に展開されます。 awk変数には代わりにTAB文字が含まれています。awk\tFS\t

awk -F '\\'、を使用してパラメータをawk受け取り、文字に\\設定します。厳密に言えば、エスケープシーケンスがまだ完了していないため、willが指定されていませんが、実際にはbusyboxを除いて私が知っているすべての実装でこれを。FS\awk -F '\'awkawkawk -F '\\'

に単一の文字が含まれるawk場合FS、その文字はフィールド区切り記号です。awk -F .ドット文字でレコードを分割します。

ただし、FS複数の文字を含む場合は正規表現として解釈されます。awk -F ..2 つの点シーケンスではオーバーフローしませんが、.1 文字に一致する正規表現演算子と同様に、2 文字のシーケンスではオーバーフローします。 2つの点に分割するには、awk -F '[.][.]'またはが必要ですawk -F '\\.\\.'

の場合、awk -F '\\\\'シェルは\\\\リテラルを に渡してこれらの 2 つをそれぞれ拡張してawk正規表現で処理されるようになります。これは正規表現構文でも特別で、文字の特別な意味を取り除くために使用されます。awk\\\FS\\\正規表現演算子としてこの時間。繰り返しますが、今回は正規表現ですが、バックスラッシュ文字に分割されます。

したがって、実際には\Bourneのようなシェルでこれがうまくいきます。

awk -F '\'      # FS becomes a single \ except in busybox where it's empty
awk -F "\\"     # instead so it's a one-character split on backslash
awk -F \\       # and a one-field-by-character split in busybox

awk -F '\\'     # FS becomes a single \ in every awk implementation
awk -F \\\\     # so one-character split on backslash
awk -F "\\\\"

awk -F '\\\'    # FS is \ on busybox and \\ in other implementations
awk -F \\\\\\   # so one-character split on backslash in busybox and
awk -F "\\\\\\" # \\ regex split in other implementations, to the same effect

awk -F '\\\\'     # FS is \\ in all implementations so
awk -F \\\\\\\\   # \\ regex split
awk -F "\\\\\\\"

一重引用符は最も直接的で最も驚くべき引用符であるため、一重引用符を使用することをお勧めします。したがって、バックスラッシュで移植可能な分割を実行するには、次の手順を実行しますawk -F '\\'

次のこともできます。

 awk -v FS='\\' ...

または

 awk 'BEGIN{FS="\\"} ...'

または

awk ... 'FS=\\'

または:

FS='\' awk 'BEGIN{FS = ENVIRON["FS"]} ...'

(追加のバックスラッシュ拡張を実行しないでくださいawk。したがって、バックスラッシュは1つだけ必要です。)

答え2

一重引用符内のすべての文字は文字通り処理されます(つまり、一重引用符ペアの間に特殊文字はありません)。一重引用符なしでリテラル文字を使用するには、特別な意味を持つバックスラッシュエスケープ文字を使用する必要があります。

これはシェルの引用規則であり、awkとは何の関係もありません。

関連情報