在bash脚本中组合正则表达式

时间:2019-03-28 14:50:30

标签: bash scripting

我正在尝试将字符串与$字符进行比较,后跟s或t和一系列数字。但是每个字母的范围都不同。 例如,如果是 s ,则可以跟0-7之间的数字,如果是 t ,则可以跟0-9之间的数字。

我设法编写了一部分if语句来进行比较,但是我不知道如何为每个字母包括不同的范围

脚本:

#!/bin/bash
input="test1.txt"
check(){
    while read -r line; do
      a=( $line )
      for i in "${a[@]:1}"; do
         if [[ "$i" == \$[st]* ]]; then
             echo "$i"
         fi
      done
    done < "$input"
}
check

我不想使用*,而是要指定 s ,它只能跟在0-7和 t 之间的数字,只能跟在0-9之间。 我尝试使用此:

if [[ "$i" == \$(s[0-7]*|t[0-9]*) ]]; then

但是我得到了这个错误:

./test.sh: line 9: syntax error in conditional expression: unexpected token `('                                         ./test.sh: line 9: syntax error near `\$(s'                                                                             ./test.sh: line 9: `if [[ "$i" == \$(s[0-7]*|t[0-9]*) ]]; then'  

2 个答案:

答案 0 :(得分:6)

=~用于正则表达式匹配,而非==。对此进行更正,并在正则表达式中使用管道(|),这表示 OR

if [[ $i =~ \$(s[0-7]*|t[0-9]*) ]]

答案 1 :(得分:1)

为什么要为此编写带有循环的脚本?如本例所示,只需使用grep即可完成此操作:

Prompt>cat test1.txt
s1
s8
t1
t8
Prompt> grep -E "s[0-7]|t[0-9]" test1.txt
s1
t1
t8

说明:

s[0-7]表示字母“ s”,后跟0到7之间的任何数字。
t[0-9]表示字母“ t”,后跟0到9之间的任何数字。

grep -E的意思是“扩展的正则表达式”。

A|B在正则表达式中表示The expression should contain A OR B(恰好是正则表达式的“扩展”部分)。