我的问题是:外壳和正则表达式匹配的空间
如
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