我可以在linux中的awk记录分隔符中使用正则表达式吗

问题描述 投票:0回答:3

我有这样的测试文件

fdsf fdsf fdsfds fdsf
fdsfdsfsdf fdsfsf
fsdfsdf var12=1343243432

fdsf fdsf fdsfds fdsf
fdsfsdfdsfsdf
fsdfsdf var12=13432434432

fdsf fdsf fdsfds fdsf
fsdfsdf fdsfsf var12=13443432432

现在我想使用

var12=\d+
作为记录分隔符。这在 awk 中可能吗

linux bash awk
3个回答
9
投票

是的,但是您应该使用

[0-9]
而不是
\d
:

awk '1' RS="var12=[0-9]+" file

IIRC,只有

GNU awk
可以使用多字符记录分隔符。

结果:

fdsf fdsf fdsfds fdsf
fdsfdsfsdf fdsfsf
fsdfsdf 


fdsf fdsf fdsfds fdsf
fdsfsdfdsfsdf
fsdfsdf 


fdsf fdsf fdsfds fdsf
fsdfsdf fdsfsf 

如果您需要进一步帮助,请发布您想要的输出。


4
投票

假设 Linux 上有 GNU awk(又名

gawk
),是的。

RS

这是awk的输入记录分隔符。它的默认值是包含单个换行符的字符串,这意味着输入记录由单行文本组成。它也可以是空字符串,在这种情况下,记录由空行分隔。 如果是正则表达式,则记录由输入文本中正则表达式的匹配项分隔。

来源: 7.5.1 控制的内置变量

awk
GNU Awk 用户指南

正如@steve所说

\d
不在正则表达式运算符
gawk
-特定正则表达式运算符
列表中,因此您需要使用括号表达式,例如
[0-9]
 [[:digit:]]
代替您的
\d

但是,从你的问题中并不清楚你的意图是什么。我已经回答了你的问题,但我怀疑我是否已经解决了你的根本问题。另请参阅什么是 XY 问题?


0
投票

11 年过去了,POSIX 2024 awk 规范仍然规定 RS 仅使用一个字符(或者对于多行记录则不使用)。 “如果 RS 包含多个字符,则结果未指定。”但现在几乎所有 awk 实现都接受 RS 的正则表达式,包括 gawk、mawk、goawk、busybox awk、toybox awk 和 Kernighan 的 One True Awk(又名 nawk)。

© www.soinside.com 2019 - 2024. All rights reserved.