为什么这个正则表达式在 awk 中不起作用?

为什么这个正则表达式在 awk 中不起作用?

我有一个这样的文本文件:

Attribute 1.............. : attribute value
Encode Date............................. : JUL 2007
Attribute 22076.......... : attribute value`

我想提取该JUL 2007段,但前提是该段前面有Encode Date“JUL 2007”,因为 JUL 2007 可能会出现在文件的其他位置。

下面的正则表达式在 regexr.com 上使用启用了全局和多行模式的 PHP 解释器进行测试时有效:

(?<=Encode Date............................. : ).*$

但是运行这个命令没有给我任何输出,我错过了什么?

cat file.txt | awk '/(?<=Encode Date............................. : ).*$/{print $0}'

答案1

awk支持POSIX 扩展正则表达式(ERE)。您尝试使用的是 Perl 兼容的正则表达式 (PCRE)。 ERE 中没有(?<=...)(“后向断言”)。

要从输入中获取编码日期,请考虑

awk -F ':' '$1 ~ /^Encode Date/ { sub("^ ", "", $2); print $2 }' file

这将每一行视为:- 分隔字段。它挑选出第一个此类字段以字符串开头的行Encode Date,并在打印之前删除该行第二个字段开头的空格。

如果使用sed,它会稍微短一些:

sed -n '/^Encode Date/s/.*: //p' file

这会找到正确的行,然后删除所有直到(包括)和:紧随其后的空格,并输出修改后的行。

或者,使用sed尝试修改每一行并打印成功修改的行的等效操作,

sed -n 's/^Encode Date.*: //p' file

如果你想打印整行(就像你的最后一个命令似乎想要做的那样),那么使用

awk '/^Encode Date/' file

或者,

sed -n '/^Encode Date/p' file

或者,

grep '^Encode Date' file

有关的:

相关内容