确保每次出现char都会出现bash中的另一个char

时间:2016-05-12 21:07:15

标签: regex string bash

我有一个非常简单的代码,如下所示:

txt="hard==2.3.3 soft==2.1.1 weak rep=2.1"

if [[ $txt =~ ([^\=]\=\=[^\=])* ]]; then
    echo "Good"
else
    echo "Bad"

# Output is "Bad"

我希望if语句仅在==时才为真,所以如果有独奏=或者有===则为假。所以基本上,如果有一个=,就必须在第二个之后。如果没有=(与weak一样),那就没关系了。

我的代码存在的问题是,只要txt中至少有一个==if就会成立。有没有办法确保每次出现都有第二个=?感谢

2 个答案:

答案 0 :(得分:1)

听起来我想要拒绝单等于或等于或等于3的情况。您当前的if语句接受双等号。

所以你应该这样做:

txt='hard==2.3.3 soft==2.1.1 weak rep=2.1';

function eq {
    txt="$1";
    if [[ ! $txt =~ (^|[^=])=([^=]|$)|={3,} ]]; then
        echo "Good"
    else
        echo "Bad"
    fi;
} ## end eq()

广泛的测试:

## test one case at a time
eq 'x    '; ## Good
eq '=    '; ## Bad
eq 'x=   '; ## Bad
eq '=x   '; ## Bad
eq 'x=x  '; ## Bad
eq '==   '; ## Good
eq 'x==  '; ## Good
eq '==x  '; ## Good
eq 'x==x '; ## Good
eq '===  '; ## Bad
eq 'x=== '; ## Bad
eq '===x '; ## Bad
eq 'x===x'; ## Bad

## test all pairwise combinations
eq 'x    =    '; ## Bad
eq 'x    x=   '; ## Bad
eq 'x    =x   '; ## Bad
eq 'x    x=x  '; ## Bad
eq 'x    ==   '; ## Good
eq 'x    x==  '; ## Good
eq 'x    ==x  '; ## Good
eq 'x    x==x '; ## Good
eq 'x    ===  '; ## Bad
eq 'x    x=== '; ## Bad
eq 'x    ===x '; ## Bad
eq 'x    x===x'; ## Bad
eq '=    x=   '; ## Bad
eq '=    =x   '; ## Bad
eq '=    x=x  '; ## Bad
eq '=    ==   '; ## Bad
eq '=    x==  '; ## Bad
eq '=    ==x  '; ## Bad
eq '=    x==x '; ## Bad
eq '=    ===  '; ## Bad
eq '=    x=== '; ## Bad
eq '=    ===x '; ## Bad
eq '=    x===x'; ## Bad
eq 'x=   =x   '; ## Bad
eq 'x=   x=x  '; ## Bad
eq 'x=   ==   '; ## Bad
eq 'x=   x==  '; ## Bad
eq 'x=   ==x  '; ## Bad
eq 'x=   x==x '; ## Bad
eq 'x=   ===  '; ## Bad
eq 'x=   x=== '; ## Bad
eq 'x=   ===x '; ## Bad
eq 'x=   x===x'; ## Bad
eq '=x   x=x  '; ## Bad
eq '=x   ==   '; ## Bad
eq '=x   x==  '; ## Bad
eq '=x   ==x  '; ## Bad
eq '=x   x==x '; ## Bad
eq '=x   ===  '; ## Bad
eq '=x   x=== '; ## Bad
eq '=x   ===x '; ## Bad
eq '=x   x===x'; ## Bad
eq 'x=x  ==   '; ## Bad
eq 'x=x  x==  '; ## Bad
eq 'x=x  ==x  '; ## Bad
eq 'x=x  x==x '; ## Bad
eq 'x=x  ===  '; ## Bad
eq 'x=x  x=== '; ## Bad
eq 'x=x  ===x '; ## Bad
eq 'x=x  x===x'; ## Bad
eq '==   x==  '; ## Good
eq '==   ==x  '; ## Good
eq '==   x==x '; ## Good
eq '==   ===  '; ## Bad
eq '==   x=== '; ## Bad
eq '==   ===x '; ## Bad
eq '==   x===x'; ## Bad
eq 'x==  ==x  '; ## Good
eq 'x==  x==x '; ## Good
eq 'x==  ===  '; ## Bad
eq 'x==  x=== '; ## Bad
eq 'x==  ===x '; ## Bad
eq 'x==  x===x'; ## Bad
eq '==x  x==x '; ## Good
eq '==x  ===  '; ## Bad
eq '==x  x=== '; ## Bad
eq '==x  ===x '; ## Bad
eq '==x  x===x'; ## Bad
eq 'x==x ===  '; ## Bad
eq 'x==x x=== '; ## Bad
eq 'x==x ===x '; ## Bad
eq 'x==x x===x'; ## Bad
eq '===  x=== '; ## Bad
eq '===  ===x '; ## Bad
eq '===  x===x'; ## Bad
eq 'x=== ===x '; ## Bad
eq 'x=== x===x'; ## Bad
eq '===x x===x'; ## Bad

答案 1 :(得分:0)

考虑一下:

$ cat script.sh
#!/bin/bash
txt="a===b"
re='(^|[^\=])=([^\=]|$)|==='

for txt in ab a=b a==b a==b a===b a= a== a=== =b ==b ===b
do
    if [[ $txt =~ $re ]]; then
        echo "$txt is Bad"
    else
        echo "$txt is Good"
    fi
done

这会产生输出:

$ bash script.sh
ab is Good
a=b is Bad
a==b is Good
a==b is Good
a===b is Bad
a= is Bad
a== is Good
a=== is Bad
=b is Bad
==b is Good
===b is Bad