shell和正则表达式匹配空格

时间:2013-03-15 20:58:36

标签: regex shell lex

这是我的问题:

e.g

echo 123\<  abc\\\ efg

输出应为

123< abc\ efg

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

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

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

 123< abc\  efg

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

请注意,自动终止令牌的字符如下:();<>&|和空格。 (bash手册说spacetab,但我非常确定newline也会分开单词。)

这样的正则表达式是可能的,但是(imho)它没什么用处,部分是因为它没有引用(或括号:a$(echo foo)b是一个单词),部分是因为结果需要为转义字符重新扫描单词。但是无所谓。这是一个示例flex regex:

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

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

  • 除元字符或转义字符以外的任何内容,或
  • 一个转义字符后跟任何单个字符,或
  • 转义字符,后跟换行符。

答案 1 :(得分:0)

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

echo 123\<  abc\\\ efg

发生以下情况:

  1. bash\<替换为<(不使用反斜杠,bash会将<视为输入重定向运算符。

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

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

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

  5. echo生成输出123< abc\ efg,一个字符串,其中一个空格分隔了两个参数。

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