我正在尝试使用重复来减少 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 来解决这个问题,并提高我对常规的理解表达式。)
答案 0 :(得分:0)
你做不到。当您重复捕获组时,下一个捕获组将被覆盖,这就是捕获组包含最后一个匹配的原因。
答案 1 :(得分:0)
sed 's/\(\([[:blank:]]\{1,\}[0-9]\{1,\}\)\{4\}\)\([0-9A-Za-z]\)/[\1](\2){\3}/' YourFile
# \1 +---------------------------------------+
# \2 +------------------------------+
# \3 +-------------+
替换变量是前括号的顺序,而不是重复时的计数