我的文档 doc.lst 由数字和字母组成,如下所示:01 ABC,我只想采用“ABC”部分。我尝试了这个,但它包含了我的 result.lst 中的数字。
sed -n -e '/[A-Z][A-Z][A-Z]/p' < doc.lst > result.lst
如何删除这些号码?
答案1
sed -n -e '/[A-Z][A-Z][A-Z]/p'
打印与该正则表达式匹配的行。
在这里,您想要:
sed -n 's/.*\([[:upper:]]\{3\}\).*/\1/p'
也就是说,您想要替换一个由任意字符组成的序列(尽可能多),后跟 3 个大写字母(用 捕获\1
)\(...\)
,后跟由捕获的字母组成的任意字符序列,如果匹配,则打印该替换的结果 (命令p
的标志)s
。
请注意,它每行只会打印一组(最右边的一组)。
要打印所有这些,您可以这样做:
tr -cs '[:upper:]' '[\n*]' | grep -Ex '.{3}'
(请注意,在某些tr
实现中,它无法正确处理多字节字符)。
这个想法是将大小写字母的补充序列解释tr为换行符,以便的输出包含所有大写字符的序列。然后你可以为你感兴趣的人做一个电子行为。scuppertr
xgrep
在像这样的输入上FOO BAR02 ABCDEF
,它会打印:
FOO
BAR
虽然之前的解决方案会打印DEF
.如果你有 GNU grep
,你可以使用它的-o
选项:
grep -Eo '[[:upper:]]{3}'
这将打印:
FOO
BAR
ABC
DEF
答案2
对于像这样的列表...
01ABC
03BHG
2TG
...您可以做很多事情。
也许最简单的是你可以这样做:
sed 's/[^[:upper:]]\{1,\}/\n/g;/^\n/D'
...这只会用任何不是大写字母的字符序列替换 ewline \n
,并避免打印随后以\n
ewline开头的任何结果(尽管如果保留大写字母,它们仍然会被打印)。
如果您希望保留大写字母后面的数字,您可以尝试:
sed -n '/[[:upper:]]/s/[^[:upper:]]*//p'
...这将从肯定包含大写字符的行的开头删除所有非大写字母并打印结果。这仅适用于每行一组,但基于您的评论 - 我想这就是您所拥有的全部?