我的問題是:外殼和正則表達式匹配的空間
如
echo 123\< abc\\\ efg
輸出應該
123< abc\ efg
我在法文件的正則表達式是
[^\n ]*[\\]+[^\n]
如果我使用這個正則表達式,我的輸出將是
123< abc\ efg
這是錯誤的。 任何人都可以告訴我如何分別匹配\(空格)和常規(空格)嗎?
謝謝!
我的問題是:外殼和正則表達式匹配的空間
如
echo 123\< abc\\\ efg
輸出應該
123< abc\ efg
我在法文件的正則表達式是
[^\n ]*[\\]+[^\n]
如果我使用這個正則表達式,我的輸出將是
123< abc\ efg
這是錯誤的。 任何人都可以告訴我如何分別匹配\(空格)和常規(空格)嗎?
謝謝!
你的正則表達式是正確的。當你在提示符下
echo 123\< abc\\\ efg
以下類型發生:
bash
取代\<
與<
(沒有反斜槓,bash
會像對待<
作爲輸入重定向操作
bash
。用單個文字替換\\
\
bash
用單個文字空間替換'\'。
bash
調用echo
命令,並向它傳遞兩個參數:123<
和abc\ efg
。
echo
產生輸出123< abc\ efg
,一個單個字符串與一個空格分隔其兩個參數。
根據您的正則表達式,它看起來像我上面的步驟5中的字符串輸出是存儲在您的文件中的內容。從這13個字節中,它會找到3個有效令牌:123<
,abc\
和efg
。如果將它們作爲單個字符串打印到標準輸出並將每個標記分隔開,則您會看到123< abc\ efg
。 (反斜槓後應該有兩個空格;我似乎無法獲得多個顯示空格。)
是的。詞法分析器將123 \
我相信你要找的是一個flex正則表達式,它將匹配一個單獨的shell令牌包含引號或其他此類複雜因素。
請注意,自動終止令牌的字符如下:();<>&|
和空白。 (bash
手冊說space
和tab
,但我很確定newline
也分開單詞。)
這樣的正則表達式是可能的,但(imho)它沒有多大用處,部分原因是它不需要引用(或包圍:a$(echo foo)b
是一個單詞),部分原因是因爲生成的單詞需要重新掃描轉義字符。但是無所謂。下面是一個示例Flex正則表達式:
([^();<>&|\\[:space:]]|\\(.|\n))+
匹配任何數量的連續實例:不是元字符或轉義字符,或
請注意,echo 123 \
chepner
2013-03-16 18:35:03
我將123 \
Lamian
2013-03-16 19:45:54