我正在强制一些学生的编码习惯,因此我正在使用 bash 脚本读取他们的源文件,并且我需要查找他们在行的开头是否有模式“class”(缩进可能会或可能不会出现在该模式之前)在行中)。如果找到该模式,则需要检查下一个字符是否为大写。例如:
class Camel
class camel
读取第一行,找到模式,class <space>
然后读取紧随其后的字符class <space>
,它是大写的“C”,表明测试正常。第二行测试失败。基本上,如果测试失败,则将 bash 变量(例如 test)设置为 FALSE,否则设置为 TRUE。我该如何使用awk
, sed
, 或 来做到这一点grep
?
答案1
awk
在您提到的三个工具( 、sed
或grep
)中的任何一个或使用支持正则表达式的任何其他工具中,这都同样简单。这是与您想要的模式匹配的正则表达式:
'^\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]'
上面一行描述了您需要匹配单词类别后的大写字母。这就是所谓的模式匹配。
这是学习正则表达式的好资源 正则表达式
谢谢。