Regex 在ksh脚本中使用正则表达式

Regex 在ksh脚本中使用正则表达式,regex,unix,ksh,Regex,Unix,Ksh,我有一个file.txt文件,其中包含一些文本,如: 000000000+000+0+00 000000001+000+0+00 000000002+000+0+00 我正在检查每一行,以确保它符合以下格式: 字符*9、+、字符*3、+等 到目前为止,我已经: #!/bin/ksh file=file.txt line_number=1 for line in $(cat $file) do if [[ "$line" != "[[.]]{9}+[[.]]{3}+[[.]]{1}+[[

我有一个file.txt文件,其中包含一些文本,如:

000000000+000+0+00 000000001+000+0+00 000000002+000+0+00 我正在检查每一行,以确保它符合以下格式: 字符*9、+、字符*3、+等

到目前为止,我已经:

#!/bin/ksh
file=file.txt
line_number=1
for line in $(cat $file)
do
    if [[ "$line" != "[[.]]{9}+[[.]]{3}+[[.]]{1}+[[.]]{2} ]" ]]
    then
        echo "Invalid number ($line) check line $line_number"
        exit 1
    fi
    let "line_number++"
done
但是,无论我在程序终止的行中添加了什么内容,这都不能正确地进行计算。

您的正则表达式看起来-使用类似的站点非常有用。从你的描述来看,我怀疑它应该更像这样

^.{9}\+.{3}\+.{1}\+.{2}$ ^[^\+]{9}\+[^\+]{3}\+[^\+]{1}\+[^\+]{2}$ ^[0-9]{9}\+[0-9]{3}\+[0-9]{1}\+[0-9]{2}$ 在[[-上的部分中,您可能希望使用=~

string=~ere 如果字符串与模式~Eere匹配,其中ere是扩展正则表达式,则为True。 注意:据我所知,ksh regex不遵循正常语法

您使用grep可能会更幸运:

X=000000000+000+0+00
grep-qE^[^\+]{9}+[^\+]{3}+[^\+]{1}+[^\+]{2}$当您需要不匹配的行号时,可以使用grep-vn。请小心编写正确的正则表达式,这样您就有了

grep -Evn "^.{9}[+].{3}[+].[+].{2}$" file.txt 
这不在您想要的布局中,因此使用sed更改布局:

编辑: 我把{1}变成了。。
sed也太过分了。当你需要spme解释时,你可以从echo Linenr:Invalid line开始

我得到了有趣的结果,直接将正则表达式置于条件中:

$ line='000000000+000+0+00'
$ [[ $line =~ ^.{9}\+.{3}\+.\+..$ ]] && echo ok
ksh: syntax error: `~(E)^.{9}\+.{3}\+.\+..$ ]] && echo ok
' unexpected
但如果我将正则表达式保存在变量中:

$ re="^.{9}\+.{3}\+.\+..$"
$ [[ $line =~ $re ]] && echo ok
ok
所以你可以

#!/bin/ksh
file=file.txt
line_number=1
re="^.{9}\+.{3}\+.\+..$"
while IFS= read -r line; do
    if [[ ! $line =~ $re ]]; then
        echo "Invalid number ($line) check line $line_number"
        exit 1
    fi
    let "line_number++"
done < "$file"
ksh glob模式有一些类似正则表达式的语法。如果其中有可选的空格,可以使用?子模式语法来处理


阅读ksh手册页的文件名生成部分。

这不是Unix脚本,这不是问题,这是ksh脚本。好的,谢谢,更新了。谢谢!我能够使用上一个。在第二个“+”之后,可能有一个空格作为字符,你知道如何解释吗?没关系,问题实际上是默认的IFS是空格、制表符或换行符。当我更改IFS=$'\n'时,它现在正是我想要的。再次感谢!!{1}显然是多余的;也许在别人笑之前把它取出来。教用户阅读grep-n输出可能最终是一个比试图使其正确可读更好的策略。
#!/bin/ksh
file=file.txt
line_number=1
re="^.{9}\+.{3}\+.\+..$"
while IFS= read -r line; do
    if [[ ! $line =~ $re ]]; then
        echo "Invalid number ($line) check line $line_number"
        exit 1
    fi
    let "line_number++"
done < "$file"
if [[ $line != ?????????+???+?+?? ]]; then echo error; fi
pattern="?????????+???+?( )?+??"

line1="000000000+000+0+00"
line2="000000000+000+ 0+00"

[[ $line1 == $pattern ]] && echo match || echo no match  # => match
[[ $line2 == $pattern ]] && echo match || echo no match  # => match