sed:动态删除除pattern定义的位置以外的所有文本列

时间:2014-11-05 00:22:55

标签: regex bash awk sed

通过搜索和尝试(没有正则表达式专家),我设法使用sed或grep处理文本输出,并提取一些行,格式化为:

Tree number 280:
1         0.500      1      node_15 6 --> H 1551.code
                     1      node_21 S ==> H node_20
Tree number 281:
1         0.500      1      node_16 S ==> M 1551.code
                     1      node_20 S --> H node_19

然后,使用

sed 's/^.\{35\}\(.\{9\}\).*/\1/' infile,我得到了所需的部分,加上一些我后来摆脱的输出(不是问题)。

Tree number 280:
 6 --> H 
 S ==> H 
Tree number 281:
 S ==> M
 S --> H

但是,C --> C模式的水平位置可能因文件而异,尽管它始终是对齐的。有没有办法提取-->==>,包括单个前面和后面的字符,无论它们在哪个列中找到?

Tree number #部分不是必需的,也可以留空,但必须有一个类型的分隔符。

更新(替代方法)

尝试使用grep,我发了

grep -Eo '(([a-zA-Z0-9] -- |[a-zA-Z0-9] ==)> [a-zA-Z0-9]|Changes)' infile

我的初始文件样本如下:如果有人想到更好,更有效的方法,或者我对正则表达式的使用是疯了,请发表评论!

..MISC TEXT...

Character change lists:


Character    CI  Steps                  Changes
----------------------------------------------------------------
1         0.000      1         node_235 H --> S node
                     1         node_123 S ==> 6 1843
                     1         node_126 S ==> H 2461
                     1         node_132 S ==> 6 1863
                     1         node_213 H --> I 1816
                     1         node_213 H --> 8 1820
..CT...

Character change lists:

Character    CI  Steps                  Changes
----------------------------------------------------------------
1         0.000      1         node_165 H --> S node
                     1         node_123 S ==> 6 1843
                     1         node_231 H ==> S 1823
..MISC TEXT...

1 个答案:

答案 0 :(得分:1)

Grep对于提取匹配的正则表达式更容易一些(如果需要不同的分隔符,可以将它们添加到由管道分隔的列表中[ - | =]

grep -o '. [-|=][-|=]> .' infile

如果你真的想要为此选择,那么第一部分应该仅匹配具有模式的行,第二部分仅提取匹配的正则表达式

sed -n '/[--|==]>/{s/.*\(. [=|-][-|=]> .\).*/\1/p}' infile