首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk-空记录分离器:"RS=“vs”RS=‘AC.26’“和”RS=(X)“

awk-空记录分离器:"RS=“vs”RS=‘AC.26’“和”RS=(X)“
EN

Unix & Linux用户
提问于 2021-01-05 18:02:14
回答 1查看 588关注 0票数 4

我知道,使用RS=,我们可以将记录分隔器设置为空/空字符串;但是,GNU awk也允许将RS定义为regex,所以我决定使用RS='|',并且我希望gawk能将它理解为RS=,这意味着“空字符串(或|)空字符串”,但这将它视为文字|字符,而当我做RS='X|Y'时,正确地识别它是一个regex (XY)。

请有人解释一下,在RS='|'中发生了什么事情,而awk没有把它作为空字符串得到?

我也尝试过RS='(|)',但这完全是另一回事,我认为它将整个输入看作一个单一记录。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 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有不同的认识:

代码语言:javascript
复制
$ 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),其中有两件事:

  1. 不能使用多字符regexp将空字符串与记录分隔器或字段分隔器相匹配。如果您这样做,它将被处理是如果RS或FS不存在,您将结束为整个输入的单个记录(对于RS)或单个字段为整个记录(对于FS)。这将在今后发布的gawk手册中明确说明。
  2. gawk 5.1.0中有一个bug (可能更早的时候,我也不知道),当忽略上面的语句时,会导致终止字符被消耗。现在已经为此编写了一个修复程序,并将在将来的gawk版本中使用。
票数 8
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/627679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档