我正在尝试删除两个字符串之间的文本,但保留模式之前和之后的所有数据。我正在使用的示例文本:
comp117_c0_seq1 len=214 path=[173:0-52 372:53-71 226:72-213]
comp143_c0_seq1 len=285 path=[263:0-226 490:227-284]
comp541_c0_seq1 len=230 path=[1:0-132 134:133-229] gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max] 1.30898e-39 68 76
所以目标是删除以“len”开头并以“path = [...]”结尾的文本。并保留所有文本区域之前和之后的所有内容。 有人会有任何建议。我希望输出看起来像:
comp117_c0_seq1
comp117_c0_seq1
comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max] 1.30898e-39 68 76
提前致谢。
答案 0 :(得分:2)
使用sed
$ sed -r 's/len[^]]*]//' input_file
comp117_c0_seq1
comp143_c0_seq1
comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max] 1.30898e-39 68 76
len
匹配len
[^]]*
否定字符类,匹配]
以外的任何内容。
*
量词,确保除]
以外的任何内容匹配零或多个tiems
]
匹配]
path
使用awk
$ awk '{sub("len[^]]*]", "")}1' input
comp117_c0_seq1
comp143_c0_seq1
comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max] 1.30898e-39 68 76
sub(ere, repl[, in ])
替换字符串repl
代替第一个实例
字符串in和return中的扩展正则表达式ERE
替换次数。
1
总是如此。 awk
采用默认操作来打印整个记录。
答案 1 :(得分:1)
从您的示例输入和输出中,您似乎要删除从len
到下一个]
的所有内容。这是(那个BSD / Mac sed):
sed -E 's/len[^]]*\]//'
含义:替换len
和每个不是]
的字符,然后是]
。这会在遇到的第一个]
处停止。这是因为sed很贪心。 perl
知道的更好:
perl -pe 's/len.*?\]//'
*?
是非贪婪的运算符,所以它只会吃掉下一个不需要的令牌。
答案 2 :(得分:0)
我会用sed:
来解决这个问题cat file | sed -e 's/(^.*)len=.*path=\[[^\]*\](.*)$/\1\2/'
我可能需要在发布您的预期输出时对其进行修改。
答案 3 :(得分:0)
假设:
$ echo "$tgt"
comp117_c0_seq1 len=214 path=[173:0-52 372:53-71 226:72-213]
comp143_c0_seq1 len=285 path=[263:0-226 490:227-284]
comp541_c0_seq1 len=230 path=[1:0-132 134:133-229] gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max] 1.30898e-39 68 76
的Perl:
$ echo "$tgt" | perl -lne 'print "$1$2" if /^(\w+)\slen=\d+\sp
ath=\[[^\]]+?\](.*)$/'
comp117_c0_seq1
comp143_c0_seq1
comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max] 1.30898e-39 68 76
或者,
$ echo "$tgt" | perl -lne 'print if s/len[^]]+\] *//'
comp117_c0_seq1
comp143_c0_seq1
comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max] 1.30898e-39 68 76