Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex返回匹配模式的最后3个字符_Regex_Grep - Fatal编程技术网

Regex返回匹配模式的最后3个字符

Regex返回匹配模式的最后3个字符,regex,grep,Regex,Grep,我使用grep搜索包含88个字符长的mrz(机器可读区域)的文本文件。在文本文件中,它们前面有一个分号。 我只想从字符串中获取字符3-5的子字符串 这是我的模式: egrep --include *.txt -or . -e ";[A-Z][A-Z0-9<][A-Z<]{3}" 分号引入了MRZ。它以大写字母开头,然后是大写字母、数字或填充字符这就是您要做的全部工作吗 $ awk -F';' '{print substr($2,3,3)}' file RUS $ sed -E '

我使用grep搜索包含88个字符长的mrz(机器可读区域)的文本文件。在文本文件中,它们前面有一个分号。 我只想从字符串中获取字符3-5的子字符串

这是我的模式:

egrep --include *.txt -or . -e ";[A-Z][A-Z0-9<][A-Z<]{3}"

分号引入了MRZ。它以大写字母开头,然后是大写字母、数字或填充字符
这就是您要做的全部工作吗

$ awk -F';' '{print substr($2,3,3)}' file
RUS

$ sed -E 's/[^;]*;..(.{3}).*/\1/' file
RUS
如果没有,则编辑您的问题,以提供更具代表性的样本输入/输出

用于查找文件的UNIX命令名为
find
,顺便说一句,而不是
grep
。我知道GNU的人为grep添加了一系列查找文件的选项,但不要使用它们,因为它们会使grep命令变得不必要的复杂(并且与其他UNIX文本处理工具不一致),因为它需要参数来查找文件以及文件中的
g/re/p
。因此,如果使用grep,您的命令行应该是:

find . -name '*.txt' -exec grep 'stuff' {} +
不是:

并对任何其他工具执行相同操作:

find . -name '*.txt' -exec grep 'stuff' {} +
find . -name '*.txt' -exec sed  'stuff' {} +
find . -name '*.txt' -exec awk  'stuff' {} +

如果您可以使用GNU Grep,您可以使用
\K
,它将不再包括匹配中以前匹配的任何字符,然后将您的字符类匹配3次:

grep -roP --include=*.txt ";[A-Z][A-Z0-9<]\K[A-Z<]{3}"

grep-roP--include=*.txt”;[A-Z][A-Z0-9添加一些示例字符串将非常有用。@pjanssen抱歉,刚才正在编辑问题,所以首先
可以使用GNU grep吗?
grep-roP--include=*.txt”[A-Z][A-Z0-9@revo是的,第一个<也可以是数字或大写字母。这并没有考虑到一些条件是可选的。@revo我不知道这到底意味着什么,但如果有输入,这个答案不适用,那么应该添加到问题中,以创建必要的条件。
find . -name '*.txt' -exec grep 'stuff' {} +
egrep --include *.txt -or . -e 'stuff'
find . -name '*.txt' -exec grep 'stuff' {} +
find . -name '*.txt' -exec sed  'stuff' {} +
find . -name '*.txt' -exec awk  'stuff' {} +
grep -roP --include=*.txt ";[A-Z][A-Z0-9<]\K[A-Z<]{3}"