我正在尝试使用正则表达式作为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 之间的区别”。
也可以FS
在awk
程序本身中进行设置。这通常在一个块中完成,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
问题中的其他错误:
- 不能在单引号字符串内使用单引号
==
是比较运算符,=
用于变量赋值