2017-08-08 39 views
0

我试图理解Unix对话的特定代码行,并且似乎无法理解awk部分正在做什么。看不懂这个awk正则表达式

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

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

提前致谢!

回答

0

如果你有[[]]这将意味着,[在括号[],像[[]接着是]等等领域符号将是[]

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

但随后的括号其他各地方式:

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

现在$2是空的,$3==b(哦,亲爱的东西完成)。

1

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

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

如果要包括在随后括号表达式它需要[]被正确地放置,即]在一开始和[

按照链接的文章:

要匹配],把它作为第一个字符开[或否定^后。要匹配-,请在关闭]之前加上。要匹配^,请将其放在最终文字-或结束]之前。

在您的例子:

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

awk套(输入)字段分隔符作为单一字面[]字符。

+0

@ JoshReback:这是否回答你的问题? – anubhava

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 ... 

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

所以,如果你想括号内,因为场分离的字符,你列出[和支架之间],但你首先把右括号在列表中,它会从字面上理解,每个指令:[][]