ここでAwkの分割動作について読みました。
[...]これFS議論分ける関数(文字列関数を参照)は拡張正規表現として解釈する必要があります。これらは次のとおりです。むしろ
~
トークンまたは任意の式であり、or演算子の右側と同じ方法で解釈する必要があります!~
。
そして:
右のオペランドが語彙トークンではなく式の場合 むしろ、式の文字列値は、上記のエスケープ規則を含む拡張正規表現として解釈されます。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_04
しかし、次のコードで予期しない結果が発生しました。
BEGIN {
print split("te.st", q, ".")
}
私は.
どんな文字でも表現され、結果になることを望みます6
。しかし、私のすべてのテストが返されます2
。このコードを実行すると、予想される結果が表示されます6
。
BEGIN {
print split("te.st", q, /./)
}
試験用:
- 愚かな
- 愚かな - POSIX
- モック 1.3.4
- モック 1.3.3
- nawk(元awk)
私は文書を間違って理解していますか、それともバグですか?
答え1
これは間違いではありません。ただ、既存の慣行を性文化しようとすると、標準は十分に明確ではないということです。
mawk(1) マニュアルがより明確です:
split(expr, A, sep)
仕組みは次のとおりです。...
(2)
sep = " "
(シングルスペース)の場合は、前後<SPACE>
で切り捨てられますexpr
。 mawkは正規表現として定義されます。それ以外の場合は正規表現として扱われます。sep
<SPACE>
<SPACE>
/[ \t\n]+/
sep
ただし、長さ1の文字列の場合、メタ文字は無視されます。、例えば、split(x, A, "*")
とsplit(x, A, /*/)
は同じです。
また、GNU awkのマニュアルは次のようになります。現在のソース:
split(s, a [, r [, seps] ])
...
分割は、上述のフィールド分割と同様に動作する。特に、
r
単一文字ストリングの場合、そのストリングは正規表現メタ文字であっても区切り文字として機能します。
susv4の説明です。基準:
拡張正規表現は、式を含む文字列を組み込み変数に割り当てることによってフィールドを区切るために使用できます。FS、直接、またはこのオプションを使用した結果として発生します
-F sepstring
。デフォルトFS変数は単一の<space>でなければなりません。以下で紹介しましょうFSアクション:
- もしFS空の文字列で、アクションが指定されていません。
もしFSは単一文字:
ㅏ。もしFS<space>の場合、前後の<blank>および<newline>文字はスキップされます。フィールドは、1つ以上の<blank>または<newline>文字セットで区切る必要があります。
b。そうでない場合FS他の文字cは何ですか?フィールドはcが発生するたびに区切る必要があります。。
それ以外の場合は文字列値FS拡張正規表現として扱う必要があります。拡張正規表現に一致するシーケンスが表示されるたびにフィールドが区切られます。
あなたの例は2.bと一致しています。
明示的に言及されているにもかかわらず、これは、引数が空白の場合を含む、FS
3番目の引数を除くすべてのawk実装で使用される引数と同じように機能します。split
FS
変数は文字列なので、動作が変わる可能性はありません(orawk
などの正規表現オブジェクトはありません。orなどの変数に正規表現を割り当てることはできません)。これは上記の操作を実行する関数(暗黙的または明示的に呼び出されます)です。パラメータを解釈する方法です。javascript
perl
a=/./
$a=qr/./
split
この動作の原因は、「古い」awkとの互換性が原因である可能性があります。ここでFS
( or の 3 番目の引数split
) は常に単一文字として扱われました。はい(UNIX v7):
$ awk 'BEGIN{FS="."; print split("foo.bar.baz", a, "bar"); print a[2] }'
3
ar.
$ awk 'BEGIN{FS="."; print split("foo.bar.baz", a, /bar/); print a[2] }'
awk: syntax error near line 1
awk: illegal statement near line 1
Bus error - core dumped