无法理解这个awk正则表达式

时间:2017-08-08 16:49:11

标签: regex bash awk

我正在尝试从Unix谈话中理解特定的代码行,并且似乎无法理解awk部分正在做什么。

整行是:man ls | col -b | grep '^[[:space:]]*ls \[' | awk -F '[][]' '{print $2}'。传递给awk的文本(如果由于某种原因你没有man程序)是:ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1] [file ...]。不知何故,awk能够将选项列表拉出来,但我真的无法理解这个正则表达式[][]实际上是如何运作的。它匹配的是什么。

我最好的猜测是外括号表示其内容包含][的字符类。如果是这种情况,为什么内括号不能写为[]。是因为括号[[]]对在awk中有不同的含义吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

在POSIX中,正则表达式[...]称为bracket expression

它与其他reegx风格的角色类非常相似。一个关键的区别是反斜杠不是POSIX括号表达式中的元字符。

如果您想在括号表达式中加入[],则需要将其正确放置,即]在开头[

根据链接文章:

  

要匹配],请将其作为开场[之后的第一个字符或否定^。要匹配-,请在结束]之前将其设置为正确。要匹配^,请将其放在最终文字-或结束]之前。

在你的例子中:

awk -F '[][]' '...'

awk将(输入)字段分隔符设置为单个文字[]字符。

答案 1 :(得分:0)

如果您有[[]],则表示[位于括号[]中,例如[[]后跟],因此字段分隔符为{ {1}}:

[]

然后括号反过来说:

$ echo a[]b | awk -F'[[]]' '{print $2}'
b

现在$ echo a][b | awk -F'[][]' '{print $3}' b 为空且$2(哦,亲爱的)。

答案 2 :(得分:0)

你对字符类的预感是正确的。如果您希望某些字符是字段分隔符,则可以在括号中列出它们。使用awk -F '[abc]' ...会将a,b和c字符指定为分隔符。订单无关紧要;您可以使用awk -F '[cab]' ...并获得相同的结果。

但是如果你想让分隔字符左右括号呢?正则表达式的文档(许多系统上的man re_format)说明了这一点:

To  include a literal `]' in the list, make it the first character ...

考虑到如何解析表达式,这是有道理的。当解析器扫描表达式时,它正在寻找结束,右侧括号。它并不关心看到另一个左括号或逗号或空格或其他什么,但是右括号会标记结尾,除非有某种方式告诉解析器从字面上理解它。由于它们之间没有任何括号[],因此没用,右括号作为第一个字符被定义为其他内容:这不是结尾,所以从字面上理解这个右括号。 / p>

因此,如果您希望括号作为字段分隔字符,则在括号中列出[],但是您将右括号放在列表中的第一位,这样就可以按字面意思理解,根据说明:[][]