0

これが私の質問です:

例えば

echo 123\<  abc\\\ efg

出力は

123< abc\ efg

私のlexファイルの正規表現は

[^\n ]*[\\]+[^\n]

この正規表現を使用すると、出力は次のようになります

 123< abc\  efg

これは間違っています。\(スペース) と通常の (スペース) をそれぞれ一致させる方法を誰か教えてもらえますか?

ありがとう!

4

2 に答える 2

1

あなたが探しているのは、引用符やその他の複雑さを含まない単一のシェル トークンに一致する flex 正規表現だと思います。

トークンを自動的に終了する文字は次のとおりであることに注意してください();<>&|。(bashマニュアルにはspaceと と書かれていますが、それも単語を区切っtabていると確信しています。)newline

このような正規表現は可能ですが、(imho)それはほとんど役に立ちません。部分的には、引用符を使用しないため(または括弧:a$(echo foo)bは単一の単語です)、部分的には、結果の単語をエスケープ文字で再スキャンする必要があるためです。しかし、何でも。フレックス正規表現のサンプルを次に示します。

([^();<>&|\\[:space:]]|\\(.|\n))+

これは、次の任意の数の連続するインスタンスに一致します。

  • メタ文字またはエスケープ文字以外のもの、または
  • エスケープ文字の後に任意の 1 文字が続く、または
  • エスケープ文字とそれに続く改行。
于 2013-03-16T22:32:49.520 に答える
0

あなたの正規表現は正しいです。プロンプトで入力すると

echo 123\<  abc\\\ efg

次のことが起こります。

  1. bash(バックスラッシュなしで置き換える\<と、入力リダイレクト演算子のように扱われます。<bash<

  2. bash\\単一のリテラルに置き換えます\

  3. bash'\ ` を単一のリテラル スペースに置き換えます。

  4. bashコマンドを呼び出し、 2 つの引数:とechoを渡します。123<abc\ efg

  5. echo123< abc\ efg2 つの引数が 1 つのスペースで区切られた単一の文字列であるoutput を生成します。

正規表現に基づいて、上記のステップ 5 の文字列出力がファイルに保存されているように見えます。これらの 13 バイトから、3 つの有効なトークン、 、 、および が検出さ123<abc\ますefg。各トークンをスペースで区切った単一の文字列として標準出力に出力すると、123< abc\ efg. (バックスラッシュの後には 2 つのスペースが必要です。複数のスペースを表示できないようです。)

于 2013-03-16T20:42:40.883 に答える