删除由大写字母和小写字母组成的单词?

删除由大写字母和小写字母组成的单词?

我有一个名为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根据您的区域设置,此脚本与第一个脚本之间可能有所不同。

相关内容