Bashスクリプトの正規表現でASCIIコードを一致させるのに問題があります。
私のペイロードは次のとおりですpayload='#1243669, start 2018-12-17 16:32:50 CET'
私の以前の正規表現は次のとおりです。regold='(#[^,]+),'
私の新しい正規表現は次のとおりです。regnew='(#[^\x2c]+)\x2c'
シェルでテストすると、regex101.comでは機能しますが、新しい正規表現は機能しないことが確認されます。
root@test# payload='#1243669, start 2018-12-17 16:32:50 CET'
root@test# regold='(#[^,]+),'
root@test# regnew='(#[^\x2c]+)\x2c'
root@test# if [[ $payload =~ $regold ]]; then echo yes; fi
yes
root@test# if [[ $payload =~ $regnew ]]; then echo yes; fi
編集する:
質問は、PCRE式がサポートされていないことをbashに伝えることによって部分的に答えられます。それで正規表現を次に移しました。
root@test# regex=$'(\x23[^\x2c]+)\x2c[[:space:]]start[[:space:]][[:digit:]]{4}\x2d[[:digit:]]{2}\x2d[[:digit:]]{2}[[:space:]]([^[:space:]]+)[[:space:]][^\x2c]+\x2c[^\x2c]+\x2c[[:space:]](captureme)'
root@test# pattern='Message #1243669, start 2018-12-17 16:32:50 CET, duration 20, captureme'
繰り返しますが、私の表現はregex101でうまく機能します。ここに例があります。https://regex101.com/r/g4UsUN/1
式はこれまで進んでいます: ... [[:space:]][^\x2c]+ ... が \x2c を追加すると bash に少し難しさがあります。
どうなりますか?
答え1
では、bash
コードのリテラル文字に16進コードを挿入できます$'\xHH'
。 bash
それ以外の場合は文字列で認識されず、正規表現は、またはで[^\x2c]
ないすべての文字と一致します。式をテストしているウェブサイトはPCRE正規表現エンジンを使用できます。そのような用途ではなく、POSIX拡張正規表現(サイトでサポートされていないようです)を使用します。これは、数字、スペース文字、プレビューなど、PCRE で使用される他の正規表現構文もサポートされていないことを意味します。\
x
2
c
regex101.com
bash
bash
\d
\s
POSIX正規表現(基本と拡張)は、システムのre_format(7)
マニュアル(man 7 re_format
)と以下を介して文書化する必要があります。POSIX規格。
だから
regnew=$'#[^\x2c]+\x2c'
(括弧は使用しないように削除しましたbash
)します。たとえば、リテラルポイントを一致させるには、\x2e
(ドット文字)の前に\\
()を付ける必要があります。\\\x2e
bash
マニュアルから:
この形式の単語は
$'string'
特に扱われます。ワードは、ANSI C規格で指定されているように置き換えられたバックスラッシュエスケープ文字を使用して文字列に展開されます。バックスラッシュエスケープシーケンスがある場合は、次のようにデコードされます。[...]
\xHH
HH
値が16進値(1桁または2桁の16進数)の8ビット文字
を使用すると、$'...'
シェルが認識する他のエスケープシーケンスも置き換えられます。