これが私の質問です:
例えば
echo 123\< abc\\\ efg
出力は
123< abc\ efg
私のlexファイルの正規表現は
[^\n ]*[\\]+[^\n]
この正規表現を使用すると、出力は次のようになります
123< abc\ efg
これは間違っています。\(スペース) と通常の (スペース) をそれぞれ一致させる方法を誰か教えてもらえますか?
ありがとう!
あなたが探しているのは、引用符やその他の複雑さを含まない単一のシェル トークンに一致する flex 正規表現だと思います。
トークンを自動的に終了する文字は次のとおりであることに注意してください();<>&|
。(bash
マニュアルにはspace
と と書かれていますが、それも単語を区切っtab
ていると確信しています。)newline
このような正規表現は可能ですが、(imho)それはほとんど役に立ちません。部分的には、引用符を使用しないため(または括弧:a$(echo foo)b
は単一の単語です)、部分的には、結果の単語をエスケープ文字で再スキャンする必要があるためです。しかし、何でも。フレックス正規表現のサンプルを次に示します。
([^();<>&|\\[:space:]]|\\(.|\n))+
これは、次の任意の数の連続するインスタンスに一致します。
あなたの正規表現は正しいです。プロンプトで入力すると
echo 123\< abc\\\ efg
次のことが起こります。
bash
(バックスラッシュなしで置き換える\<
と、入力リダイレクト演算子のように扱われます。<
bash
<
bash
\\
単一のリテラルに置き換えます\
bash
'\ ` を単一のリテラル スペースに置き換えます。
bash
コマンドを呼び出し、 2 つの引数:とecho
を渡します。123<
abc\ efg
echo
123< abc\ efg
2 つの引数が 1 つのスペースで区切られた単一の文字列であるoutput を生成します。
正規表現に基づいて、上記のステップ 5 の文字列出力がファイルに保存されているように見えます。これらの 13 バイトから、3 つの有効なトークン、 、 、および が検出さ123<
れabc\
ますefg
。各トークンをスペースで区切った単一の文字列として標準出力に出力すると、123< abc\ efg
. (バックスラッシュの後には 2 つのスペースが必要です。複数のスペースを表示できないようです。)