我正在尝试检查文件中的每一行是否与我的模式匹配(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(无大写)
不要检查 的输出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(扩展正则表达式)。
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |