这是我的问题:
例如
echo 123\< abc\\\ efg
输出应该是
123< abc\ efg
我在 lex 文件中的正则表达式是
[^\n ]*[\\]+[^\n]
如果我使用这个正则表达式,我的输出将是
123< abc\ efg
这是错误的。谁能告诉我如何分别匹配\(空格)和常规(空格)?
谢谢!
我相信您正在寻找的是一个 flex 正则表达式,它将匹配一个不包含引号或其他此类复杂情况的单个 shell 令牌。
请注意,自动终止标记的字符如下:();<>&|
和空格。(bash
手册说space
and tab
,但我很确定这newline
也是分开的词。)
这样的正则表达式是可能的,但是(恕我直言)它用处不大,部分原因是它不需要引用(或括号:a$(echo foo)b
是一个单词),部分原因是需要重新扫描生成的单词以查找转义字符。但是无所谓。这是一个示例 flex 正则表达式:
([^();<>&|\\[:space:]]|\\(.|\n))+
匹配任意数量的连续实例:
你的正则表达式是正确的。当您在提示符下键入
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
. (反斜杠后面应该有两个空格;我似乎无法显示多个空格。)