ファイルがあります。
$ 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
と\\\\n
gensub()が何を見るのかを説明できますか?
たとえば \n
、bashは(bashの一重引用符のために)これを変更しないので、gawkは\n
これを見ることができますか? gawkはgensub()が見ている\n
ように修正されます。では、gensub() が一致する改行文字であることをなぜ知っていますか?n
n
答え1
には強い引用符があるので、を使用するとリテラルがに渡され、を使用するとリテラルが渡されbash
ます。バリエーションはありません。'...'
'\n'
\n
awk
'\\n'
\\n
では、awk
内部と"..."
...が拡張されます。したがって(またはその中の何か)に渡されると、これは実際の改行文字であり、渡されると 。\n
\\
"\n"
gensub()
print
awk
"\\"
\
最初の引数は、実装ごとに異なる特別な意味を持つ正規gensub()
表現としても理解されます。\
実装間の一貫した点は、正規表現が\\
リテラルと\
同様にリテラルと一致することです。ただし、正規表現の場合、改行またはaと一致するかどうかは実装によって異なります。の場合、改行文字が一致します。したがって、両方とも改行文字をに置き換えます。 1つ目はリテラル改行文字がに渡され、2番目は改行と一致する正規表現として理解されるためです。\.
.
\n
n
gawk
gensub("\n", "x")
gensub("\\n", "x")
x
gensub()
\n
gensub()
過去にPOSIX仕様でこの問題を処理したことに注意してくださいawk
。これは仕様の次のバージョンで修正される予定です。バラよりhttp://austingroupbugs.net/view.php?id=1105もっと学ぶ。
/\n/
代わりに使用するとさらに混乱します"\n"
。