簡體   English   中英

Bash 正則表達式字符串變量匹配

[英]Bash regex string variable match

我有以下用 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__

我如何使用 bash 腳本實現這一目標? 基本上,我希望能夠讀取和匹配字符串“Seconds_Behind_Master: N”末尾的值,其中 N 可以是任何值。

您可以在 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

輸出

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

男人 bash #BASH_REMATCH

如果你想繼續使用正則表達式,你可以使用一個工具,例如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

“多於一位數”的特定情況僅通過模式匹配就特別容易:

case $string in
   *Seconds_Behind_Master: [1-9][0-9]*) echo Too long;;
   *) echo OK;;
esac

要更接近地模擬 Perl 代碼正在執行的操作,您可以使用簡單的字符串替換來提取數字。

s=${string##*Seconds_Behind_Master: }
s=${s%%[!0-9]*}
[ $s -gt 10 ] && echo "Too long: $s" || echo OK.

這些是 glob 模式,而不是正則表達式; *匹配任何字符串, [!0-9]匹配單個非數字字符。 所有這些都是與 Bourne 兼容的,即不只是嚴格意義上的 Bash(您可以使用/bin/sh而不是/bin/bash )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM