如何使用sed和/或awk删除仅以大写字母书写的所有单词

3

我正在尝试使用sed删除仅由大写字母编写的所有单词:

sed -r "s/\b[A-Z]\w*\s*//g" < file1 > file2

但是这种解决方案捕获所有以大写字母开头的单词并将其删除(这不是目标)。
下面是一个例子:
file1内容:
AAAAAAAAAAAA
BBbbbbb
AbAbAbAb
aaaaaBBBBB
AAAAAA BBBBBB
A1-B1
a1-b1
A1-b1 AA
AAAAA BBBBB AAAAA
Abbbb AAA
AAAAA AAAABB
Abbbb Baaaa Aaaaa AB
AAAAAA1
BBBBBBb
AAAAAA 1
BBBBBB b

结果应该像这样(file2的内容):
BBbbbbb
AbAbAbAb
aaaaaBBBBB
A1-B1
a1-b1
A1-b1 AA
Abbbb AAA
Abbbb Baaaa Aaaaa AB
AAAAAA1
BBBBBBb
AAAAAA 1
BBBBBB b

每一行至少包含一个数字或小写字母,不能被删除。

5个回答

5

使用egrep:

egrep "[^[:upper:] ]" file
BBbbbbb
AbAbAbAb
aaaaaBBBBB
A1-B1
a1-b1
A1-b1 AA
Abbbb AAA
Abbbb Baaaa Aaaaa AB
AAAAAA1
BBBBBBb
AAAAAA 1
BBBBBB b

或使用awk:

awk '/[^[:upper:] ]/' file

或使用sed:

sed -n '/[^[:upper:] ]/p' file

@damienfrancois:谢谢,是的,那是一个打字错误。 - anubhava
这个 awk '/[^A-Z ]/' 在我的标准Ubuntu 12.4上无法工作,因为本地语言会干扰 A-Z。使用 awk '/[^[:upper:] ]/' file 更稳定和便携。 - Jotne

2
sed -n "/[A-Z]/!p"

不要打印至少有一个大写字母的行。只需检查是否包括空行,在这种情况下它们被包括在内。

2

尝试:

awk '! /^[[:space:][:upper:]]*$/' infile

它产生:

BBbbbbb
AbAbAbAb
aaaaaBBBBB
A1-B1
a1-b1
A1-b1 AA
Abbbb AAA
Abbbb Baaaa Aaaaa AB
AAAAAA1
BBBBBBb
AAAAAA 1
BBBBBB b

1

你一开始的想法并不太离谱。先把正则表达式中的\w去掉,因为它匹配任何字母数字字符。然后只打印非空行。

sed -rn "s/\b[A-Z]+\s*//g; /[a-z0-9]/p" < file1 > file2 

1

任何不包含数字或小写字母的行都会被删除:

sed '/[[:digit:][:lower:]]/!d' file1 > file2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接