我正在尝试从Unix谈话中理解特定的代码行,并且似乎无法理解awk部分正在做什么。
整行是:man ls | col -b | grep '^[[:space:]]*ls \[' | awk -F '[][]' '{print $2}'
。传递给awk的文本(如果由于某种原因你没有man程序)是:ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1] [file ...]
。不知何故,awk能够将选项列表拉出来,但我真的无法理解这个正则表达式[][]
实际上是如何运作的。它匹配的是什么。
我最好的猜测是外括号表示其内容包含][
的字符类。如果是这种情况,为什么内括号不能写为[]
。是因为括号[[]]
对在awk中有不同的含义吗?
提前致谢!
答案 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>
因此,如果您希望括号作为字段分隔字符,则在括号中列出[
和]
,但是您将右括号放在列表中的第一位,这样就可以按字面意思理解,根据说明:[][]