我有一个大文本文件,其中包含包含所有数字、所有字母和字符的行,并且还包含包含数字、字母和字符的行,我只想打印包含除最后一个或最后两个字符之外的所有数字的行。
打印以数字开头但以最后一个字符或最后两个非数字字符结尾的行。例如
1234567a 2245678902da A1234566d 12345678abc
输出必须是
1234567a 22345678902da
打印除第一个字符以外所有字符都是数字的行,或者打印第一个和第二个字符不是数字的行。例如
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