我有一个名为file.txt
.该文件中有由大小写字母组成的单词,也有由大小写字母和数字组成的单词。我想过滤这个文件,所以输出中不包含包含的单词两个都大写和小写字母。例如,输入file.txt
:
Aaa
aBb
aB
Aa12
12aA
123
123Ab
AAA
aaa
该文件中存在包含大小写字母的单词(例如Aaa、aBp),并且单词包含大小写字母和数字(例如 123Ab)。此外,单词仅包含小写字母(例如aaa),或仅包含大写字母(例如AAA)。我只想删除包含上层的单词和小写字母(例如Aaa、aBp),因此输出如下:
Aa12
12aA
123
123Ab
AAA
aaa
有任何想法吗?
答案1
grep -Exv '[A-Za-z]*([A-Z][a-z]|[a-z][A-Z])[A-Za-z]*'
解释
- 这个想法是首先匹配与您想要的相反的内容,即那些仅包含大写和小写字母的行。这使用
grep -Ex
,即带有扩展正则表达式的 grep ,匹配整行。然后该-v
标志否定正则表达式,即返回那些不要匹配以下正则表达式。 - 中心部分
([A-Z][a-z]|[a-z][A-Z])
匹配一个大写字母后跟一个小写字母,反之亦然。 - 外部部分
[A-Za-z]*...[A-Za-z]*
意味着该行的其余部分必须仅包含大写或小写字母。
答案2
假设grep
每行一个单词:
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
要报告文本中的所有匹配单词,每行可能有多个单词,单词由非单词字符分隔:
<text tr -cs '[:alnum:][:digit:]_' '[\n*]' |
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
请注意,您需要一个兼容 POSIX 的tr
实现,GNUtr
无法满足。在 GNU 系统上,您可以使用sed
:
<text sed -E 's/\W+/\n/g' |
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
答案3
要重申您的要求,您需要保持一句话,如果:
- 它包含一个
数字非字母,或 - 全部是大写字母,或者
- 都是小写字母
然后
awk '/[^[:alpha:]]/ || /^[[:upper:]]+$/ || /^[[:lower:]]+$/' file
答案4
使用sed
:
$ sed -E -e '/[0-9]/b' -e '/^[A-Z]+$/b' -e '/^[a-z]+$/b' -e 'd' <file
Aa12
12aA
123
123Ab
AAA
aaa
带注释的sed
脚本:
/[0-9]/b # Digits are present, branch to end
/^[A-Z]+$/b # Only uppercase characters present, branch to end
/^[a-z]+$/b # Only lowercase characters present, branch to end
d # Delete line, start next cycle
# (at end, implicit print)
或者,
sed -E -e '/[[:digit:]]/b' -e '/^[[:upper:]]+$/b' -e '/^[[:lower:]]+$/b' -e 'd' <file
sed
根据您的区域设置,此脚本与第一个脚本之间可能有所不同。