Flex ルール ファイルでは\\
、単一のバックスラッシュ「\」文字に一致させるために使用します。これは\
、Flex でエスケープ文字として使用されるためです。
BACKSLASH \\
LITERAL_BACKSLASH \\\\
LITERAL_LESSTHAN \\\\<
LITERAL_GREATERTHAN \\\\>
LITERAL_VERTICALBAR \\\\|
私があなたを正しくフォローしている場合、あなたの場合、「\>」はリテラル「>」として扱われますが、「\\>」はリテラル「\」として扱われ、その後に特別なリダイレクトが続きます。通常の引数文字と特殊文字のリテラル バージョンの両方を受け入れる 1 つのルールを作成できるため、これを達成するために否定的な後読みや特に特別なことは必要ありません。
説明のために、引数/パラメーターには、' '、'\t'、および特殊な形式の '>'、'<'、'|' 以外の任意の文字を含めることができると仮定しましょう。引数のルールは次のようになります。
ARGUMENT ([^ \t\\><|]|\\\\|\\>|\\<|\\\|)+
どこ:
[^ \t\\><|]
' '、'\t' 以外の任意の 1 文字に
\\\\
一致し、特殊文字は "\" の任意のインスタンス (つまり、リテラルのバックスラッシュ)
\\>
に一致します ">" の任意のインスタンス (つまり、リテラルより大きい)
\\<
に一致します<" (リテラルより小さい)
\\\|
は、"\|" の任意のインスタンスに一致します。(つまり、文字通りの垂直バー/パイプ)
実際には...おそらくそのルールを次のように短縮できます。
ARGUMENT ([^ \t\\><|]|\\[^ \t\r\n])+
どこ:
[^ \t\\><|]
は、' '、'\t' 以外の任意の 1 文字と
\\[^ \t\r\n]
一致し、特殊文字は、空白を除いて、入力内の '\' が前にあるすべての文字と一致します (これにより、すべての特殊文字が処理され、他のすべての文字のリテラル形式が可能になります)。 )
引数/パラメータにリテラルの空白を許可したい場合は、ルールをさらに短くすることができますが、\\.
「\n」と一致する場合と一致しない場合があるため、ルールの後半を使用する場合は注意してください (つまり、末尾を食べます)。コマンド ターミネータ文字!)。
それが役立つことを願っています!