这是我的问题:
e.g
echo 123\< abc\\\ efg
输出应为
123< abc\ efg
我的lex文件中的正则表达式是
[^\n ]*[\\]+[^\n]
如果我使用这个正则表达式,我的输出将是
123< abc\ efg
这是错误的。 谁能告诉我如何分别匹配\(空格)和常规(空格)?
谢谢!
答案 0 :(得分:1)
我相信你正在寻找的是一个flex正则表达式,它将匹配一个不包含引号或其他类似复杂功能的shell令牌。
请注意,自动终止令牌的字符如下:();<>&|
和空格。 (bash
手册说space
和tab
,但我非常确定newline
也会分开单词。)
这样的正则表达式是可能的,但是(imho)它没什么用处,部分是因为它没有引用(或括号:a$(echo foo)b
是一个单词),部分是因为结果需要为转义字符重新扫描单词。但是无所谓。这是一个示例flex regex:
([^();<>&|\\[:space:]]|\\(.|\n))+
匹配任意数量的连续实例:
答案 1 :(得分:0)
你的正则表达式是正确的。当您在提示符下键入
时echo 123\< abc\\\ efg
发生以下情况:
bash
将\<
替换为<
(不使用反斜杠,bash
会将<
视为输入重定向运算符。
bash
将\\
替换为单个文字\
bash
用单个文字空格替换'\`。
bash
调用echo
命令,传递2个参数:123<
和abc\ efg
。
echo
生成输出123< abc\ efg
,一个字符串,其中一个空格分隔了两个参数。
根据您的正则表达式,看起来上面的步骤5中的字符串输出是存储在您的文件中的内容。从这13个字节中,它将找到3个有效令牌:123<
,abc\
和efg
。如果它将它们作为单个字符串打印到标准输出,并且每个标记分隔一个空格,您将看到123< abc\ efg
。 (反斜杠后面应该有两个空格;我似乎无法显示多个空格。)