2013-03-15 24 views
0

我的問題是:外殼和正則表達式匹配的空間

echo 123\< abc\\\ efg 

輸出應該

123< abc\ efg 

我在法文件的正則表達式是

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

如果我使用這個正則表達式,我的輸出將是

123< abc\ efg 

這是錯誤的。 任何人都可以告訴我如何分別匹配\(空格)和常規(空格)嗎?

謝謝!

+0

請注意,echo 123 \ chepner 2013-03-16 18:35:03

+0

我將123 \ Lamian 2013-03-16 19:45:54

回答

0

你的正則表達式是正確的。當你在提示符下

echo 123\< abc\\\ efg 

以下類型發生:

  1. bash取代\<<(沒有反斜槓,bash會像對待<作爲輸入重定向操作

  2. bash。用單個文字替換\\\

  3. bash用單個文字空間替換'\'。

  4. bash調用echo命令,並向它傳遞兩個參數:123<abc\ efg

  5. echo產生輸出123< abc\ efg,一個單個字符串與一個空格分隔其兩個參數。

根據您的正則表達式,它看起來像我上面的步驟5中的字符串輸出是存儲在您的文件中的內容。從這13個字節中,它會找到3個有效令牌:123<abc\efg。如果將它們作爲單個字符串打印到標準輸出並將每個標記分隔開,則您會看到123< abc\ efg。 (反斜槓後應該有兩個空格;我似乎無法獲得多個顯示空格。)

+0

是的。詞法分析器將123 \ Lamian 2013-03-16 20:55:54

1

我相信你要找的是一個flex正則表達式,它將匹配一個單獨的shell令牌包含引號或其他此類複雜因素。

請注意,自動終止令牌的字符如下:();<>&|和空白。 (bash手冊說spacetab,但我很確定newline也分開單詞。)

這樣的正則表達式是可能的,但(imho)它沒有多大用處,部分原因是它不需要引用(或包圍:a$(echo foo)b是一個單詞),部分原因是因爲生成的單詞需要重新掃描轉義字符。但是無所謂。下面是一個示例Flex正則表達式:

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

匹配任何數量的連續實例:不是元字符或轉義字符,或

  • 轉義字符後跟任何單個字符其他

    • 什麼,或
    • 轉義字符,後跟換行符。