我想用脚本验证文本文件。
要验证的文件是:
FDFHDK JKL
1545665 152
HDKFHDK UHG
YRYRUBH DFG
867HDKE WER
有效行必须与正则表达式匹配'[A-Z]{7}+[[:space:]]+[A-Z]{3}'
。
如果所有行都有效,则脚本会显示一条消息,说明文件正常。
如果至少有一行与正则表达式不匹配,则脚本应显示一条消息并显示与正则表达式不匹配的行。
脚本是:
#!/usr/bin/env bash
result=""
output=$(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1" |wc -l)
if [[ $output > 0 ]]
then
echo "These lines don't match:"
result="${resultado} $(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1") \n"
echo -e $result
else
echo "The text file is valid"
fi
预期的输出是
These lines don't match
FDFHDK JKL
1545665 152
867HDKE WER
但我越来越
These lines don't match:
FDFHDK JKL 1545665 152 867HDKE WER
所以实际的脚本没有考虑换行符。
绝对没有理由使用中间变量来存储命令的输出只是为了执行测试或输出该数据。
正则表达式已被更正以删除多余的
+
after{7}
。该if
语句直接测试退出状态grep
。语句中的grep
命令以及之后的命令用于强制进行整行匹配,第一个语句用于在第一个匹配时停止而不输出任何内容。if
-x
grep
-q
代码中的实际问题是使用不
$result
带引号的,这会导致 shell 将值拆分为空格、制表符和换行符,然后对生成的单词进行文件名通配符。然后将最后一组单词作为参数给出,echo
并以空格作为分隔符将它们打印出来。如果您担心运行
grep
两次,则只运行一次并将其输出存储到例如临时文件中:我提出这个替代方案:
@they 的回答请注意: