3

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

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

但是这个解决方案捕获了所有以大写字母开头的单词并将它们删除(这不是目标)。

这是一个例子:

文件1内容:

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

每行至少一个数字或一个小写字母应保持原样(不应删除)。

4

5 回答 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
于 2013-11-05T15:50:34.650 回答
2
sed -n "/[A-Z]/!p"

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

于 2013-11-06T12:52:05.600 回答
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
于 2013-11-05T15:50:00.590 回答
1

从一开始你就离得不远了。首先从您的正则表达式中删除\w,它匹配任何字母数字。然后只打印非空行。

sed -rn "s/\b[A-Z]+\s*//g; /[a-z0-9]/p" < file1 > file2 
于 2013-11-05T15:57:18.443 回答
1

删除任何没有数字或小写字母的行:

sed '/[[:digit:][:lower:]]/!d' file1 > file2
于 2013-11-05T16:04:25.817 回答