我有一个文件
$ 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 是否修改\n
为n
gensub() 看到的n
,如果是,为什么 gensub() 知道它是要匹配的换行符?
答案1
在bash
,中'...'
是强引号,因此 with '\n'
,一个文字\n
被传递给awk
and with '\\n'
,一个文字\\n
。没有任何转变。
In awk
、 inside和"..."
...被扩展。因此,当传递给(或中的任何内容)时,这是一个实际的换行符,而当传递给 时,这是一个.\n
\\
"\n"
gensub()
print
awk
"\\"
\
现在,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"
。