我正在使用grep搜索包含88个字符长的MRZ(机器可读区域)的文本文件。在文本文件中,它们以分号开头。 我只想从字符串中获取3-5个字符的子字符串。
这是我的模式:
egrep --include *.txt -or . -e ";[A-Z][A-Z0-9<][A-Z<]{3}"
这是一个文本文件:
text is here;P<RUSIVAN<<DEL<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<F64D123456RUS7404124F131009734P41234<<<<<<<8 ;2019-02-08
这是我的输出:
;P<RUS
这是我想要的输出:
RUS
分号介绍了MRZ。它以大写字母开头,后跟大写字母,数字或填充符<
。然后跟随3位数字的国家/地区代码,其中可以包含大写字母或填充符<
。
此模式工作正常,但我只想返回的是我要量化的最后3位数字。有没有办法只获取匹配模式的最后3个字符?
在示例文本文件中,所需的输出为RUS
。
谢谢!
答案 0 :(得分:1)
如果可以使用GNU Grep,则可以使用\K
,它将不再在匹配中包含任何先前匹配的字符,然后匹配您的字符类3次:
grep -roP --include=*.txt ";[A-Z][A-Z0-9<]\K[A-Z<]{3}"
答案 1 :(得分:0)
这就是您要尝试的全部吗?
$ awk -F';' '{print substr($2,3,3)}' file
RUS
$ sed -E 's/[^;]*;..(.{3}).*/\1/' file
RUS
否则,请编辑您的问题以提供更真实的示例输入/输出。
用于查找的UNIX命令名为find
,顺便说一句,而不是grep
。我知道GNU伙计们添加了很多选项来查找要grep的文件,但是不要使用它们,因为它们会使您的grep命令不必要地复杂(并且与其他UNIX文本处理工具不一致),因为它随后需要{{1 }}文件以及文件中的find
。因此,如果您使用的是grep,则您的命令行应为:
g/re/p
不是:
find . -name '*.txt' -exec grep 'stuff' {} +
并对其他任何工具执行相同操作:
egrep --include *.txt -or . -e 'stuff'