如何使用 GREP 确定文件中的每一行是否与我的模式匹配?

MB-*_*-20 3 linux bash grep

我正在尝试检查文件中的每一行是否与我的模式匹配(4 个字符后跟 4 个数字)。我尝试将 GREP 与 -x -P -v -q 选项一起使用,因此如果我的文件不符合要求,它会返回 1。我希望它在文件正确的情况下不返回任何内容,但即使文件有错误它也不返回任何内容。$4 是我的输入文件。我的代码是:

if [ -f $4 ] && [ `grep -q -P -x -v [[a-z]x{4}/[\dx{4}] $4` ]
then
echo "error"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)

输入示例:bmkj2132 ahgc3478(无大写)

cho*_*oba 5

不要检查 的输出grep,检查其退出代码。

if [ -f "$4" ] && grep -q ...
Run Code Online (Sandbox Code Playgroud)

注意周围的双引号$4- 否则包含空格的文件名会破坏脚本。

另外,单引号正则表达式。方括号在 bash 中很特殊,当随机文件名存在时,您不希望正则表达式突然更改(扩展)。

另请注意,x这并不意味着“时间”(在 -e、-E、-P 下都不是)。量词只是跟在 quantified 之后,中间没有操作符:

echo abcd1234 | grep -xP '[a-z]{4}\d{4}'
Run Code Online (Sandbox Code Playgroud)

所以,完整的条件应该是

if [ -f "$4" ] && grep -qvxP '[a-z]{4}\d{4}' "$4" ; then
    echo Error >&2
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

如果文件不存在,您确定要继续吗?如果不是,则将条件更改为

if ! [ -f "$4" ] || grep ...
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你真的不需要这里的 PCRE 表达式。如果替换\d[0-9][[:digit:]],则可以切换到-E(扩展正则表达式)。