如何检查大写字母在一行中是否遵循特定模式?

如何检查大写字母在一行中是否遵循特定模式?

我正在强制一些学生的编码习惯,因此我正在使用 bash 脚本读取他们的源文件,并且我需要查找他们在行的开头是否有模式“class”(缩进可能会或可能不会出现在该模式之前)在行中)。如果找到该模式,则需要检查下一个字符是否为大写。例如:

    class Camel
    class camel

读取第一行,找到模式,class <space>然后读取紧随其后的字符class <space>,它是大写的“C”,表明测试正常。第二行测试失败。基本上,如果测试失败,则将 bash 变量(例如 test)设置为 FALSE,否则设置为 TRUE。我该如何使用awk, sed, 或 来做到这一点grep

答案1

awk在您提到的三个工具( 、sedgrep)中的任何一个或使用支持正则表达式的任何其他工具中,这都同样简单。这是与您想要的模式匹配的正则表达式:

'^\s*class [A-Z]'

它匹配行开头的任意数量的空格,后跟字符串class,然后是大写字母。您可以通过在此(部分)grep命令中使用它来应用它:

grep -Pq '^\s*class [A-Z]'

要测试它,您可以尝试如下操作:

user@host:~$ \
if echo '    class Camel' | grep -Pq '\s*class [A-Z]'; then \
    echo TRUE; \
else \
    echo FALSE; \
fi

TRUE

user@host:~$ \
if echo '    class camel' | grep -Pq '\s*class [A-Z]'; then \
    echo TRUE; \
else \
    echo FALSE; \
fi

FALSE

如果你想将结果存储在变量中TEST,那么你可以执行如下操作:

if echo '    class camel' | grep -Pq '\s*class [A-Z]'; then \
    TEST=TRUE; \
else \
    TEST=FALSE; \
fi

答案2

要读取文件的内容,您可以使用 cat 命令显示该文件,然后将其输出转移到其他命令输入。下面是简单的正则表达式,符合您的基本要求。

cat hello | grep '^\s*class [A-Z]'

描述 :

'cat hello'

这将显示文件的内容。

'|'

这称为管道。它将第一个命令输出定向到下一个命令输入。

'grep'

grep 命令用于进行模式匹配。

'^\s*class [A-Z]'

上面一行描述了您需要匹配单词类别后的大写字母。这就是所谓的模式匹配。

这是学习正则表达式的好资源 正则表达式

谢谢。

相关内容