2013-03-15 48 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))+ 

匹配任何数量的连续实例:不是元字符或转义字符,或

  • 转义字符后跟任何单个字符其他

    • 什么,或
    • 转义字符,后跟换行符。