仅打印除最后一个或最后两个字符或第一个或第二个字符之外的所有数字的行

仅打印除最后一个或最后两个字符或第一个或第二个字符之外的所有数字的行

我有一个大文本文件,其中包含包含所有数字、所有字母和字符的行,并且还包含包含数字、字母和字符的行,我只想打印包含除最后一个或最后两个字符之外的所有数字的行。

  1. 打印以数字开头但以最后一个字符或最后两个非数字字符结尾的行。例如

    1234567a
    2245678902da
    A1234566d
    12345678abc
    

    输出必须是

    1234567a
    22345678902da
    
  2. 打印除第一个字符以外所有字符都是数字的行,或者打印第一个和第二个字符不是数字的行。例如

    A1234
    Ab1234
    1a1234
    Abc1234
    

    输出必须是

    A1234
    Ab1234
    

谢谢

答案1

$ grep -Ex '[[:digit:]]+(.|[^[:digit:]]{2})' file1
1234567a
2245678902da

扩展正则表达式[[:digit:]]+(.|[^[:digit:]]{2})将匹配一个或多个数字,后跟一个未指定的字符或两个非数字(这是您的规范的字面解释“以数字开头,但以最后一个字符或最后两个非数字字符结尾")。该-x选项可grep确保匹配将跨越整行。

请注意,您指定的内容的字面解释也匹配包含以下内容的行:仅有的数字。

$ grep -Ex '[^[:digit:]]{1,2}[[:digit:]]+' file2
A1234
Ab1234

我们匹配以一两个非数字开头,然后包含一个或多个数字直到行尾的行。


对于两个正则表达式的直观表示(同时也展示如何使用sed):

首先:

$ sed -nE 's/^([[:digit:]]+)(.|[^[:digit:]]{2})$/(\1)(\2)/p' file1
(234567)(a)
(2245678902)(da)

第二:

$ sed -nE 's/^([^[:digit:]]{1,2})([[:digit:]]+)$/(\1)(\2)/p' file2
(A)(1234)
(Ab)(1234)

删除命令中的所有括号sed即可得到sed解决方案。

答案2

略有不同的解释。我读到这个是因为最后 1-2 个字符不能是数字,所以我得到

grep -E '^[[:digit:]]+[^[:digit:]]{1,2}$' file
1234567a
2245678902da

答案3

对于下面的第一个问题是命令

sed -n '/^[0-9]*[a-z]\{,2\}$/p' filename

输出

1234567a
2245678902da

对于下面的第二个问题是命令

 sed -n '/^[A-Za-z]\{1,2\}[0-9]*$/p'

输出:

A1234
Ab1234

相关内容