重复和分组的问题

时间:2014-03-06 13:04:11

标签: regex sed grouping

我正在尝试使用重复来减少 sed 模式的输入,但是我得到了意想不到的结果。

我正在解析的文本结构为:

   \s+\d+\s+\d+\s+\d+\s+\d+\[0-9A-Za-z] ...

我尝试使用重复来减少一行上的输入量,并使命令更易于读取/调试:

   ^\s+((\d+\s+){4})([0-9A-Za-z]).*$

当我尝试在 sed 中使用它作为替换命令时,\ 2的值始终等于\ 1中的最后一个字。如果我将重复从4改为5,我可以将字母数字模式转换为\ 2但是它也会出现在\ 1中。我需要\ 1中的值用于其他内容,所以我不想混淆结果或使用解决方法,例如从\ 1输出中删除最后一个单词。

有谁知道为什么会发生这种情况或我做错了什么?

(我知道 awk 是处理这个问题的最简单方法,但我决心用 sed 来解决这个问题,并提高我对常规的理解表达式。)

2 个答案:

答案 0 :(得分:0)

你做不到。当您重复捕获组时,下一个捕获组将被覆盖,这就是捕获组包含最后一个匹配的原因。

答案 1 :(得分:0)

sed 's/\(\([[:blank:]]\{1,\}[0-9]\{1,\}\)\{4\}\)\([0-9A-Za-z]\)/[\1](\2){\3}/' YourFile
#  \1  +---------------------------------------+ 
#  \2    +------------------------------+
#  \3                                           +-------------+

替换变量是前括号的顺序,而不是重复时的计数