0

这是我的问题:

例如

echo 123\<  abc\\\ efg

输出应该是

123< abc\ efg

我在 lex 文件中的正则表达式是

[^\n ]*[\\]+[^\n]

如果我使用这个正则表达式,我的输出将是

 123< abc\  efg

这是错误的。谁能告诉我如何分别匹配\(空格)和常规(空格)?

谢谢!

4

2 回答 2

1

我相信您正在寻找的是一个 flex 正则表达式,它将匹配一个不包含引号或其他此类复杂情况的单个 shell 令牌。

请注意,自动终止标记的字符如下:();<>&|和空格。(bash手册说spaceand tab,但我很确定这newline也是分开的词。)

这样的正则表达式是可能的,但是(恕我直言)它用处不大,部分原因是它不需要引用(或括号:a$(echo foo)b是一个单词),部分原因是需要重新扫描生成的单词以查找转义字符。但是无所谓。这是一个示例 flex 正则表达式:

([^();<>&|\\[:space:]]|\\(.|\n))+

匹配任意数量的连续实例:

  • 元字符或转义字符以外的任何内容,或
  • 后跟任何单个字符的转义字符,或
  • 转义字符后跟换行符。
于 2013-03-16T22:32:49.520 回答
0

你的正则表达式是正确的。当您在提示符下键入

echo 123\<  abc\\\ efg

发生以下情况:

  1. bash替换\<<( 没有反斜杠,bash将被<视为输入重定向运算符。

  2. bash替换\\为单个文字\

  3. bash用单个文字空格替换 '\ `。

  4. bash调用echo命令,传递给它 2 个参数:123<abc\ efg.

  5. echo产生输出123< abc\ efg,一个字符串,用一个空格分隔它的两个参数。

根据您的正则表达式,我上面第 5 步中的字符串输出看起来像是存储在您的文件中的内容。从这 13 个字节中,它将找到 3 个有效标记:123<abc\efg. 如果它将它们作为单个字符串打印到标准输出,每个标记用空格分隔,您会看到123< abc\ efg. (反斜杠后面应该有两个空格;我似乎无法显示多个空格。)

于 2013-03-16T20:42:40.883 回答