Bash正则表达式字符串变量匹配

The*_*gia 4 regex bash perl

我在perl中编写了以下脚本,工作得很好.但我试图用bash实现同样的目的.

    #!/usr/bin/perl

use 5.010;
use strict;

INIT {
    my $string = 'Seconds_Behind_Master: 1';
    my ($s) = ($string =~ /Seconds_Behind_Master: ([\d]+)/);
    if ($s > 10) {
        print "Too long... ${s}";
    } else {
        print "It's ok";
    }
}

__END__
Run Code Online (Sandbox Code Playgroud)

如何使用bash脚本实现此目的?基本上,我希望能够读取和匹配字符串"Seconds_Behind_Master:N"末尾的值,其中N可以是任何值.

xxf*_*xxx 10

您可以在 bash 中使用正则表达式,就像在 perl 中一样。

#!/bin/bash

STRING="Seconds_Behind_Master: "

REGEX="Seconds_Behind_Master: ([0-9]+)"

RANGE=$( seq 8 12 )

for i in $RANGE; do
    NEW_STRING="${STRING}${i}"
    echo $NEW_STRING;

    [[ $NEW_STRING =~ $REGEX ]]
    SECONDS="${BASH_REMATCH[1]}"
    if [ -n "$SECONDS" ]; then
        if [[ "$SECONDS" -gt 10 ]]; then
            echo "Too Long...$SECONDS"
        else
            echo "OK"
        fi
    else
        echo "ERROR: Failed to match '$NEW_STRING' with REGEX '$REGEX'"
    fi
done
Run Code Online (Sandbox Code Playgroud)

输出

Seconds_Behind_Master: 8
OK
Seconds_Behind_Master: 9
OK
Seconds_Behind_Master: 10
OK
Seconds_Behind_Master: 11
Too Long...11
Seconds_Behind_Master: 12
Too Long...12
Run Code Online (Sandbox Code Playgroud)

男人 bash #BASH_REMATCH


Krz*_*soń 5

你可以使用它的工具,例如,sed如果你想留在正则表达式:

#!/bin/sh
string="Seconds_Behind_Master: 1"
s=`echo $string | sed -r 's/Seconds_Behind_Master: ([0-9]+)/\1/g'`
if [ $s -gt 10 ]
then
    echo "Too long... $s"
else
    echo "It's OK"
fi
Run Code Online (Sandbox Code Playgroud)

  • 嗯?Bash 具有基于 glob 的字符串替换,它非常有能力解决这个问题。 (2认同)