如何匹配正则表达式中特定单词以外的全大写单词

如何匹配正则表达式中特定单词以外的全大写单词

我有大量文件包含我想删除的所有大写单词,但也有一小部分我想保留在文件中的单词,我该如何在正则表达式中做到这一点。

例如:

文件1.txt:

hello_world
HELLO
WORLD
HI
hi
test_string
TEST
TESTING

我想删除此文件中的所有大写单词,除了TEST这样TESTING ,输出将是

hello_world
hi
test_string
TEST
TESTING

答案1

有了perl,你可以这样做:

perl -C -pe 's/\b(?:(TEST|TESTING)|[\p{Lu}_]+)\b/$1/g' your-file

将删除由非单词字符(单词字符为数字或下划线)分隔的一个或多个大写字符或下划线的序列,但TEST和除外TESTING

如果要删除由一个这样的单词组成的行,您可以这样做:

sed -E '/^(TEST|TESTING)$/b
        /^[[:upper:]_]+$/d' your-file

或者

perl -C -lne 'print if $_ eq "TEST" ||
                       $_ eq "TESTING" ||
                       ! /^[\p{Lu}_]+$/' your-file

或者:

awk '$0 == "TEST" || $0 == "TESTING" || ! /^[[:upper:]_]+$/' your-file

或者对于、、 为空或至少包含一个除大写字母和下划线之外的字符的grep行:TESTTESTING

grep -E '(^(TEST|TESTING)?$)|[^[:upper:]_]'

相关内容