我有一个这样的文本文件:
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
有关的: