Regex返回匹配模式的最后3个字符
我使用grep搜索包含88个字符长的mrz(机器可读区域)的文本文件。在文本文件中,它们前面有一个分号。 我只想从字符串中获取字符3-5的子字符串 这是我的模式: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 '
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}"