bash、gawk、およびgensub()はバックスラッシュをどのように連続的に処理しますか?

bash、gawk、およびgensub()はバックスラッシュをどのように連続的に処理しますか?

ファイルがあります。

$ cat f2
line 1; li
ne 2$

最後は、$ファイルの内容の一部ではなく bash プロンプトです。

頑張ってるgawk を使用して、数字で終わらない各行を次の行に関連付けます。。しかし、以前の投稿とは異なり、私は改行文字の前にさまざまな数のバックスラッシュを試して、bash、gawk、およびgensub()がバックスラッシュを処理する方法を見つけようとしています\n。 3つ以上のバックスラッシュが先に来るgawkコマンドがn数字で終わらない行を見つけることができないのはなぜですか?そうでなければ成功します。通常、bash、gawk、およびgensub()はバックスラッシュを順番にどのように処理しますか?ありがとうございます。

$ gawk 'BEGIN{RS="\f"} {b=gensub("([^[:digit:] ]) *\n", "\\1", "g"); print b}' f2
line 1; line 2
$ gawk 'BEGIN{RS="\f"} {b=gensub("([^[:digit:] ]) *\\n", "\\1", "g"); print b}' f2
line 1; line 2
$ gawk 'BEGIN{RS="\f"} {b=gensub("([^[:digit:] ]) *\\\n", "\\1", "g"); print b}' f2
line 1; line 2
$ gawk 'BEGIN{RS="\f"} {b=gensub("([^[:digit:] ]) *\\\\n", "\\1", "g"); print b}' f2
line 1; li
ne 2

\n\\nおよびgawkがそれぞれbashとgawkを介して渡されるとき、gawk\\\n\\\\ngensub()が何を見るのかを説明できますか?

たとえば \n、bashは(bashの一重引用符のために)これを変更しないので、gawkは\nこれを見ることができますか? gawkはgensub()が見ている\nように修正されます。では、gensub() が一致する改行文字であることをなぜ知っていますか?nn

ベストアンサー1

には強い引用符があるので、を使用するとリテラルがに渡され、を使用するとリテラルが渡されbashます。バリエーションはありません。'...''\n'\nawk'\\n'\\n

では、awk内部と"..."...が拡張されます。したがって(またはその中の何か)に渡されると、これは実際の改行文字であり、渡されると 。\n\\"\n"gensub()printawk"\\"\

最初の引数は、実装ごとに異なる特別な意味を持つ正規gensub()表現としても理解されます。\

実装間の一貫した点は、正規表現が\\リテラルと\同様にリテラルと一致することです。ただし、正規表現の場合、改行またはaと一致するかどうかは実装によって異なります。の場合、改行文字が一致します。したがって、両方とも改行文字をに置き換えます。 1つ目はリテラル改行文字がに渡され、2番目は改行と一致する正規表現として理解されるためです。\..\nngawkgensub("\n", "x")gensub("\\n", "x")xgensub()\ngensub()

過去にPOSIX仕様でこの問題を処理したことに注意してくださいawk。これは仕様の次のバージョンで修正される予定です。バラよりhttp://austingroupbugs.net/view.php?id=1105もっと学ぶ。

/\n/代わりに使用するとさらに混乱します"\n"

おすすめ記事