通过搜索和尝试(没有正则表达式专家),我设法使用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...
答案 0 :(得分:1)
Grep对于提取匹配的正则表达式更容易一些(如果需要不同的分隔符,可以将它们添加到由管道分隔的列表中[ - | =]
grep -o '. [-|=][-|=]> .' infile
如果你真的想要为此选择,那么第一部分应该仅匹配具有模式的行,第二部分仅提取匹配的正则表达式
sed -n '/[--|==]>/{s/.*\(. [=|-][-|=]> .\).*/\1/p}' infile