bash、gawk 和 gensub() 如何连续处理反斜杠?

bash、gawk 和 gensub() 如何连续处理反斜杠?

我有一个文件

$ cat f2
line 1; li
ne 2$

其中注意最后一个$是 bash 提示符,而不是文件内容的一部分。

我试着用 gawk 将不以数字结尾的每一行与其下一行连接起来。但与我之前的文章不同的是,现在我尝试通过在新行字符前面尝试不同数量的反斜杠来弄清楚 bash、gawk 和 gensub() 如何处理反斜杠\n。我想知道为什么前面带有三个以上反斜杠的 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\\\n\\\\n分别通过 bash 和 gawk 时 gawk 和 gensub() 看到什么吗?

\n个例子,bash 不会修改它(因为 bash 中的单引号)所以 gawk 看到\n吗? gawk 是否修改\nngensub() 看到的n,如果是,为什么 gensub() 知道它是要匹配的换行符?

答案1

bash,中'...'是强引号,因此 with '\n',一个文字\n被传递给awkand with '\\n',一个文字\\n。没有任何转变。

In awk、 inside和"..."...被扩展。因此,当传递给(或中的任何内容)时,这是一个实际的换行符,而当传递给 时,这是一个.\n\\"\n"gensub()printawk"\\"\

现在,gensub()也将其第一个参数理解为正则表达式,其中\也具有因实现而异的特殊含义。

实现之间的一致之处在于,正则\\表达式匹配文字\就像\.匹配文字一样.。然而,对于\n正则表达式,是否匹配换行符或 an因实现而异。在 的情况下gawk,匹配换行符。因此, 和 都gensub("\n", "x")gensub("\\n", "x")换行符替换为x,第一个是因为文字换行符被传递到gensub(),第二个是因为\n被传递到gensub(),它被理解为与换行符匹配的正则表达式。

请注意,POSIX 规范过去在处理awk.这将在下一版本的规范中得到纠正。看http://austingroupbugs.net/view.php?id=1105了解详情。

/\n/当使用代替 时,它会变得更加混乱"\n"

相关内容