我知道,使用RS=,我们可以将记录分隔器设置为空/空字符串;但是,GNU awk也允许将RS定义为regex,所以我决定使用RS='|',并且我希望gawk能将它理解为RS=,这意味着“空字符串(或|)空字符串”,但这将它视为文字|字符,而当我做RS='X|Y'时,正确地识别它是一个regex (X或Y)。
请有人解释一下,在RS='|'中发生了什么事情,而awk没有把它作为空字符串得到?
我也尝试过RS='(|)',但这完全是另一回事,我认为它将整个输入看作一个单一记录。
发布于 2021-01-05 18:03:25
根据定义,RS='|' 是一个文字|。任何单个字符RS都被视为跨所有awk的可移植性的文字,否则在gawk与POSIX awk之间将有一个RS='|'行为不同的脚本。因此,单个char RS是文字的,而多char字符串作为RS是regexp,如果awk版本支持它,否则它实际上只是字符串的第一个字符(所以RS='.'总是一个文本.,而RS='.x'是任何字符,在某些awk中是x,在另一些方面是文字. )。
顺便说一句,在任何其他regexp上下文中,每个POSIX中的单个|都是未定义的行为,但是许多工具将其视为一个字面|,而*和?这样的regexp重复字符也是如此。
至于RS='(|)' --意思是"null或null“,这与"null”相同,您也可以将其写为()。似乎所有字符都匹配,我不知道为什么不匹配。不同的工具似乎对regexp有不同的认识:
$ printf 'foo\n' | sed -E 's/()/x/g'
xfxoxox
$ printf 'foo\n' | grep -Eo '()'
$
$ printf 'foo\n' | awk '{gsub(/()/,"x")} 1'
xfxoxox
$ printf 'foo\n' | awk -v RS='()' -v ORS='x\n' '1'
foox我联系了GNU开发人员(请参阅https://lists.gnu.org/archive/html/bug-gawk/2021-01/msg00003.html),其中有两件事:
https://unix.stackexchange.com/questions/627679
复制相似问题