如何在 awk 中使用正则表达式作为字段分隔符?

如何在 awk 中使用正则表达式作为字段分隔符?

我正在尝试使用正则表达式作为awk.从我的阅读来看,这似乎是可能的,但我无法得到正确的语法。

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

想法?目标(如果不是显而易见的话)是获得没有版本号的软件列表。

答案1

你把你的引用和语法弄乱了。要设置输入字段分隔符,最简单的方法是使用-F命令行上的选项:

awk -F '[0-9]' '{ print $1 }'

或者

awk -F '[[:digit:]]' '{ print $1 }'

这将使用任何数字作为输入字段分隔符,然后输出每行的第一个字段。

[0-9]表达式[[:digit:]]不是相当相同,具体取决于您的区域设置。看 ”[0-9]、[[:digit:]] 和 \d 之间的区别”。

也可以FSawk程序本身中进行设置。这通常在一个块中完成,BEGIN因为它是一次性初始化:

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

请注意,单引号不能在 shell 中的单引号字符串中使用,并且该awk字符串总是使用双引号。

答案2

库萨拉南达的回答+1。或者,可以在 BEGIN 块中设置 FS 变量:

awk 'BEGIN {FS="[0-9]"} {print $1}'

在操作块中更改 FS 在读取下一行之前不会生效

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

问题中的其他错误:

  • 不能在单引号字符串内使用单引号
  • ==是比较运算符,=用于变量赋值

相关内容